Loader异步加载
来源:互联网 发布:单片机圆孔插座 编辑:程序博客网 时间:2024/05/22 03:04
使用CursorLoader查询加载数据:
1 获取LoaderManager:
manager=this.getLoaderManager();
2 实现LoaderCallBacks接口,重写其中三个方法:
onCreateLoader 创建Loader对象,返回对象与数据
onLoaderFinish 数据加载完毕之后调用的方法
onLoaderReset 当loader被重置之后调用的方法,之前的数据不可用
这些方法均运行在主线程中.
3初始化Manager:
manager.initLoader(100, null, this);
4触发事件,进行异步查询.
现在使用CursorLoader从数据库中查询联系人的信息,展现.
并且添加查询菜单,模糊查询姓名,重新加载数据展现.
菜单的xml文件:
<item android:id="@+id/action_seach" android:orderInCategory="100" android:showAsAction="always"android:actionViewClass="android.widget.SearchView" />
然后为该菜单添加触发事件:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); MenuItem menuItem=menu.findItem(R.id.action_seach); SearchView actionView=(SearchView) menuItem.getActionView(); actionView.setOnQueryTextListener(new OnQueryTextListener() { // 文本提交的时候调用 @Override public boolean onQueryTextSubmit(String query) { // TODO Auto-generated method stub return false; } //当文本改变的时候调用 @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub Bundle bundle=new Bundle(); if(newText!=null){ bundle.putString("keyword", newText); /* * 重建loader,并且将数据传入给新建的loader */ manager.restartLoader(100, bundle, MainActivity.this); } return true; } }); return true;}
覆写的oncreate()方法: //返回loader与数据
// 返回null时会重新调用该方法,否则调用onLoaderfinish.
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { if(bundle!=null){ String keyword=bundle.getString("keyword"); return new CursorLoader(this,Uri.parse(contact), new String[]{"_id","display_name"}, "display_name like ?", new String[]{"%"+keyword+"%"}, null); }else{ return new CursorLoader(this,Uri.parse(contact),new String[]{"_id","display_name"},null,null,null); }}
覆写onLoaderFinish:
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // TODO Auto-generated method stub //置换适配器中的游标并且重查数据,刷新界面 adapter.swapCursor(data);}
以上方法运行在主线程中,我们也可以自定义Loader
,查询数据:
//自定义的Loader必须声明为静态
public static class MyAsyncTask extends AsyncTaskLoader<Cursor>{ private Bundle bundle; public MyAsyncTask(Context context,Bundle bundle) { super(context); this.bundle=bundle; } @Override protected void onStartLoading() { // TODO Auto-generated method stub super.onStartLoading(); //必须调用,否则无法执行下面方法 this.forceLoad(); }
// 完成之后,调用onLoaderFinish方法
public Cursor loadInBackground() { // TODO Auto-generated method stub if(bundle!=null){ String keyword=bundle.getString("keyword"); return resolver.query(Uri.parse(contact), new String[]{"_id","display_name"}, "display_name like ?", new String[]{"%"+keyword+"%"}, null); }else{ return resolver.query(Uri.parse(contact),new String[]{"_id","display_name"},null,null,null); } }}
函数的调用顺序
调用的顺序
oncreateLoader
执行异步操作
onLoaderFinish
deliverResult
* 销毁顺序:
onStopLoading
onLoaderReset
现在比较一下:
异步任务与异步加载之间的区别:
异步任务:
在 onPreExcute中执行预备操作
在 ondoInbackground中开启子线程执行任务
在onPostExceute将执行的结果返回到主线程中.
在子线程执行的过程中可以将执行的进度发送到主线程中,
onPublishProgress方法发布,在onProgressUpdate方法中接受到进度.
其本质是开启一个子线程,执行一项任务,并将任务的最终结果返回到主线程中.
异步加载:
在onCreateLoader中执行异步的查询,
在onLoadFinished中将查询的结果交给主线程.
在异步查询的时候,也是开启一个异步任务而已,只不过,这个异步任务是查询的任务.
- Loader异步加载
- Loader异步加载ContentProvider
- Loader异步加载ContentProvider
- android---(Loader异步加载)
- 异步加载机制-----Loader
- Android异步加载数据---Loader
- 使用Loader加载异步数据
- Loader(异步加载数据)
- Android Loader 异步加载数据
- Android异步加载数据--Loader
- Android—Loader异步加载
- Android-Universal-Image-Loader 异步加载图片
- universal-image-loader图片异步加载
- Universal-Image-Loader异步加载图片详解
- Android异步加载器Loader的使用
- Android Loader机制,实现异步加载数据
- Android 异步加载神器Loader全解析
- Android Loader 异步加载详解二:探寻Loader内部机制
- PowerPoint2013无法播放
- forward(转发)和redirect(重定向)的区别
- 3
- 用php写简单的json数据
- Poll设备操作(国嵌笔记)
- Loader异步加载
- java网络编程基础
- Android View 滚动的轮子-WheelView
- IT 人如何寻找电子书籍呢?
- 自动创建设备文件 (国嵌笔记)
- boost的多线程学习一
- printf("%d",5.01)和printf("%f",5)的输出结果
- Hdoj 1424 Rescue 【BFS】
- Docker学习笔记 — Docker容器