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 }

 

转载于:https://www.cnblogs.com/SoulCode/p/5436658.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值