Loader加载内容提供者的数据
2016-03-10 10:48
309 查看
用途:当从内容提供者中获取的数据太多时,界面创建的时候就会好卡,如果加载数据的时间太长了就有可能出现ANR,所以最好将加载数据的任务放到子线程中来完成。而Loader就可以很完美的做到这一点。
下面就来介绍下CursorLoader,其实它就是一个异步任务:
它继承了AsyncTaskLoader:
使用方法:
先写一个类来实现LoaderManager.LoaderCallbacks接口,重写里面的几个方法:
//创建Loader对象并返回,由主线程执行
onStartLoading(),
// 当Loader对象加载完数据时执行该方法,并把查询的结果返回给 参数data ,由主线程执行
onStopLoading(),
// 重置Loader,由主线程执行
onReset().
可以使用调用的那个类来实现接口,然后重写那几个方法。
接下来就使用loader了:
//使用CursorLoader加载数据
getLoaderManager().initLoader(6, null, this);
基本上的步骤就是这样,
实例代码:
这里面用到searchView组件,通过注册相应的点击事件,完成数据的搜索。
就是这么方便!
下面就来介绍下CursorLoader,其实它就是一个异步任务:
它继承了AsyncTaskLoader:
public class CursorLoader extends AsyncTaskLoader<Cursor> { final ForceLoadContentObserver mObserver;
使用方法:
先写一个类来实现LoaderManager.LoaderCallbacks接口,重写里面的几个方法:
//创建Loader对象并返回,由主线程执行
onStartLoading(),
// 当Loader对象加载完数据时执行该方法,并把查询的结果返回给 参数data ,由主线程执行
onStopLoading(),
// 重置Loader,由主线程执行
onReset().
可以使用调用的那个类来实现接口,然后重写那几个方法。
接下来就使用loader了:
//使用CursorLoader加载数据
getLoaderManager().initLoader(6, null, this);
基本上的步骤就是这样,
实例代码:
/** * Loader: * ContentResoler访问ContentProvider提供的数据,是在UI线程执行的 * 当数据量大时,可能会出现卡顿的现象,所以最好把获取数据的功能由子线程完成 * 那么Loader就可以实现 * *使用Loader加载ContentProvider提供的数据 *并实现通过名字或者电话里面含的文本来搜索联系人 */ public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{ //对raw_contacts和data两张表进行连接查询的uri private Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; private String[] columns={"_id","display_name","raw_contact_id","data1"}; private ListView listView; private SimpleCursorAdapter adapter; private SearchView search; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); search = (SearchView) findViewById(R.id.search); listView = (ListView) findViewById(R.id.listView); adapter = new SimpleCursorAdapter(this, R.layout.item_contact,null, new String[]{"display_name","data1"}, new int[]{R.id.text_name,R.id.text_phone}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); listView.setAdapter(adapter); //使用CursorLoader加载数据 //1:让Activity或Fragment实现接口LoaderCallbacks //2:启动Loader //得到Loader管理对象 //第一个参数是一个标识,第二个参数是给Loader传递的参数,第三个参数是实现了 LoaderCallbacks接口的对象 //当启动了Loader,会先去执行onCreateLoader方法,然后后台加载数据,当数据加载完成时执行回调方法onLoadFinished //把后台返回的Cursor对象传给参数data getLoaderManager().initLoader(6, null, this); //给SearchView添加事件监听 search.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextChange(String newText) { //参数newText接收的是用户输入的文本 //把用户查询的数据封装成Bundle对象 Bundle args = new Bundle(); args.putString("key", newText); //重新启动Loader //args传给了onCreateLoader方法的args参数 getLoaderManager().restartLoader(6, args, MainActivity.this); return false; } }); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // 创建Loader对象并返回,由主线程执行 //CursorLoader l;//CursorLoader继承了AsyncTaskLoader String where = null; String[] whereArgs = null; //生成查询条件 if(args!=null) { String data = args.getString("key"); where = "display_name like ? or data1 like ?"; whereArgs = new String[]{"%"+data+"%","%"+data+"%"}; } return new CursorLoader(this, contactUri, columns, where, whereArgs, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 当Loader对象加载完数据时执行该方法,并把查询的结果返回给 参数data ,由主线程执行 adapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { // 重置Loader,由主线程执行 adapter.swapCursor(null); } }
这里面用到searchView组件,通过注册相应的点击事件,完成数据的搜索。
就是这么方便!
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- ruby实现的一个异步文件下载HttpServer实例
- C#异步绑定数据实现方法
- C#线程间不能调用剪切板的解决方法
- 修复mysql数据库
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- C#线程同步的三类情景分析
- C#实现窗体间传递数据实例
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C#中异步回调函数用法实例