zoukankan      html  css  js  c++  java
  • LoaderManager异步加载数据库

    Loaders简介,

    loader提供了一套在UI主线程中异步加载数据的框架。使用Loader可以非常简单的在Activity或在Fragment中异步加载数据,一般用户大量的数据查询,或者需要经常修改并将数据及时地展示在UI上,这样可以避免数据查询时造程UI主线成卡顿。

    Loader有以下特点:

      1.在Activity或者在Fragment中适合用。

      2.可以提供异步加载数据的方式。

      3.监听数据,当数据改变的时候,将新的数据发布到UI上。

      4.Loader使用Cursor加载数据,在更改Cursor数据的时候,会自动连接到最后配置的Cursor中读取数据,因此不需要重新查询数据。

    LoaderManager简介,

    LoaderManager,装载机管理器,用于在Activity或者在Fragment中管理一个或多个Loader实例。在Activity或者在Fragment中可以通过getLoaderManager获取LoaderManager对象,它是以一种单例获得LoaderManager对象的。所以每个Activity或者Fragment中只有一个LoaderMnager,一个LoaderManager可以有多个Loader。

    这里介绍LoaderManager提供的几个方法,用于管理Loader。

     initLoader(int id, Bundle args, LoaderCallbacks<D> callback)    
         初始化一个Loader,并注册回调事件. 
     
     restartLoader(int id, Bundle args, LoaderCallbacks<D> callback)    
         重新启动或创建一个Loader,并注册回调事件。 

    public Loader<Cursor> onCreateLoader(int id, Bundle args)
      根据指定的ID,初始化一个新的Loader。

     onLoadFinished(Loader<Cursor> loader, Cursor cursor)
     当Loader加载完毕后调用,在其中处理Loader获取的Cursor数据。

    1,建立一个activity,或者Fragment。在一个应用程序中用Loader有以下步骤:

      2,获得一个LoaderManager实例。

      3,通过调用LoaderManager的initLoader的方法实例化一个Loader。

      4,实现匿名接口LoaderManager.LoaderCallbacks.

     下面是一个实例的部分代码:

      1 public class MainActivity extends Activity {
      2 
      3     private LoaderManager manager;
      4     private ListView listView;
      5     MyAdapter adapter = null;
      6     @Override
      7     protected void onCreate(Bundle savedInstanceState) {
      8         super.onCreate(savedInstanceState);
      9         setContentView(R.layout.activity_main);
     10         listView = (ListView) findViewById(R.id.listview);
     11         manager = getLoaderManager();//加载LoaderManager完成异步加载数据的操作 (1)
     12         manager.initLoader(1000, null, callbacks ); //(2)实例化一个Loader
     13         registerForContextMenu(listView);
     14     }
     15 
     16     @Override
     17     public void onCreateContextMenu(ContextMenu menu, View v,
     18             ContextMenuInfo menuInfo) {
     19         // TODO 自动生成的方法存根
     20         super.onCreateContextMenu(menu, v, menuInfo);
     21        getMenuInflater().inflate(R.menu.main, menu);
     22     } 
     23     
     24     public Dialog createDialog(Context context){
     25         Dialog dialog = new Dialog(context);
     26         dialog.setContentView(R.layout.add);
     27         return dialog;
     28     }
     29     
     30     public boolean onContextItemSelected(MenuItem item) {
     31         AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
     32         switch (item.getItemId()) {
     33             case R.id.add: 
     34                 //添加自定义对话框,完成对数据的入录
     35                     final Dialog dialog = createDialog(MainActivity.this);
     36                     Button button = (Button) dialog.findViewById(R.id.button1);
     37                     button.setOnClickListener(new OnClickListener() {
     38                         
     39                         @Override
     40                         public void onClick(View v) {
     41                             // TODO 自动生成的方法存根
     42                             EditText editText = (EditText) dialog.findViewById(R.id.editText1);
     43                             String name = editText.getText().toString().trim();
     44                             ContentResolver resolver = MainActivity.this.getContentResolver();
     45                             Uri url = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student");
     46                             ContentValues values = new ContentValues();
     47                             values.put("name", name);
     48                             Uri uri = resolver.insert(url, values);
     49                             if(null != uri)
     50                                 manager.restartLoader(1000, null, callbacks);
     51                             dialog.dismiss();
     52                         }
     53                     });
     54                     dialog.show();
     55                 return true;
     56             case R.id.delete:
     57                   if(adapter ==  null)
     58                       return false;
     59                   int position = info.position;
     60                   String name = adapter.getItem(position).toString();
     61                   ContentResolver resolver =  MainActivity.this.getContentResolver();
     62                   Uri url = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student");
     63                   String where = "name=?";
     64                   String[] selectionArgs = {name};
     65                   int count = resolver.delete(url, where, selectionArgs);
     66                   if(count > 0){
     67                       manager.restartLoader(1000, null, callbacks);
     68                   }
     69                   return true;
     70             
     71         }
     72         return false;
     73     }
     74     
     75     @Override
     76     public boolean onCreateOptionsMenu(Menu menu) {
     77         // Inflate the menu; this adds items to the action bar if it is present.
     78         getMenuInflater().inflate(R.menu.main, menu);
     79         return true;
     80     }
     81     private LoaderCallbacks<Cursor> callbacks = new LoaderCallbacks<Cursor>() { //(3)
     82         
     83         @Override
     84         public void onLoaderReset(Loader<Cursor> loader) {
     85             // TODO 自动生成的方法存根
     86             
     87         }
     88         //完成对Ui数据的提取,更新UI操作
     89         @Override
     90         public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
     91             // TODO 自动生成的方法存根
     92             //把数据提取出来,放到适配器中完成对UI的更新.
     93             List<String> list = new ArrayList<String>();
     94             while(cursor.moveToNext()){
     95                 String name = cursor.getString(cursor.getColumnIndex("name"));
     96                 list.add(name);
     97             }
     98             adapter = new MyAdapter(MainActivity.this);
     99             adapter.setList(list);
    100             listView.setAdapter(adapter);
    101             adapter.notifyDataSetChanged();
    102         }
    103         
    104         @Override
    105         public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    106             // TODO 自动生成的方法存根
    107             //使用new 一个CursorLoader的实例,从ContentProvider里提取数据放在loader中的Cursor里面,并返回loader
    108             Uri uri = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student");
    109             CursorLoader loader = new CursorLoader(MainActivity.this, uri, null, null, null, null);
    110             
    111             return loader;
    112         }
    113     };
    114     
    115     private class MyAdapter extends BaseAdapter{
    116 
    117         private List<String> list;
    118         private Context context;
    119         public MyAdapter(Context context) {
    120             
    121             this.context = context;
    122         }
    123         public void setList(List<String> list){
    124             this.list = list;
    125         }
    126         @Override
    127         public int getCount() {
    128             // TODO 自动生成的方法存根
    129             return list.size();
    130         }
    131 
    132         @Override
    133         public Object getItem(int position) {
    134             // TODO 自动生成的方法存根
    135             return list.get(position);
    136         }
    137 
    138         @Override
    139         public long getItemId(int position) {
    140             // TODO 自动生成的方法存根
    141             return position;
    142         }
    143 
    144         @Override
    145         public View getView(int position, View convertView, ViewGroup parent) {
    146             // TODO 自动生成的方法存根
    147             TextView view = null;
    148             if(convertView == null)
    149                 view = new TextView(context);
    150             else
    151                 view = (TextView)convertView;
    152             view.setText(list.get(position).toString());
    153             return view;
    154         }
    155     }
    156 
    157     
    158 }
  • 相关阅读:
    LeetCode 123 Best Time to Buy and Sell Stock III
    直接选择排序算法汇总
    zoom:1是什么意思
    怎么去掉织梦网站首页带的index.html/index.php
    wamp apache无法启动的解决方法
    提交到svn服务器时,一直缓冲不,
    桌面上图标都不见了怎么办听语音
    如何清除网上浏览痕迹?清除缓存
    TortoiseSVN文件夹及文件图标不显示解决方法
    快捷键
  • 原文地址:https://www.cnblogs.com/SoulCode/p/5436658.html
Copyright © 2011-2022 走看看