是从android3.0 以后出现的东西,要理解这里需要先理解为什么会出现加载器(也有地方把它说成是装载器)呢?
如果没有加载器的话,
首先Activity是我们的前端页面展现,数据库是我们的数据持久化地址,那么正常的逻辑就是在展示页面的渲染页面的阶段进行数据库查询。拿到数据以后才展示页面。
但是这个逻辑有一些缺点:
首先是查询数据的逻辑放在了UI生成的同个线程中,这个就意味着在查询数据的时候,UI页面生成的工作被阻塞住了。UI一旦被阻塞用户就会被感知出来了,因此就会出现各种无相应页面(Application Not Response),或者activity页面延迟的现象,这对用户体验来说是不可接受的。
其次是在渲染页面的时候需要固定需要进行一次数据查询,但是这个是很不节省资源的。假如一个Activity从一个停止状态回到前台,那么这个时候尽管数据并没有变化,但是也需要进行一次query操作。在浪费资源的同时也再次增加了页面渲染失败的风险。
还有就是当数据变化的时候如何通知页面进行修改呢?这个时候往往就又要创建一个monitor的角色,来当数据源变化的时候来让页面重新调用requery。
因此在Android的越来越提倡用户体验的今天,加载器和加载管理器(Loader,LoaderManager)就出现了。
loader的作用?
1.在单独的线程中读取数据
2.监视数据的更新
3. loader对Activity和Fragment都有效.
想要使用loader必须要有一个loadeManager的对象,一个loaderManager可以管理一个或者多个Loader对象,
一个Activity或者Fragent只有一个loaderMananger对象
loadeMangaer管理loader的初始化,重启和销毁操作
4.loader的使用:
>1:创建Loadermanager 对象
>2:LoaderManager对象 initLoader(1,2,3)
参数:3loaderManager.CallBacks<>
>3: onCreateLoader 下载数据 异步的
>4:onLoadFinished 更新数据
>5;重启或者关闭loader onLoaderReset
4,CursorLoader:
>CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
5,AsyncTaskLoader<D>
/**
*
* 自定义的loader
*
*/
public static class MyAsyncTaskLoader extends AsyncTaskLoader<Cursor>{
public MyAsyncTaskLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/**
* 当AsyncTaskLoader创建完毕 加载数据的方法 启动加载
*/
@Override
protected void onStartLoading() {
// TODO Auto-generated method stub
super.onStartLoading();
forceLoad();//必须加 强制向下执行 强制加载异步数据
Log.i("=onStartLoading==", Thread.currentThread().getId()+" "+Thread.currentThread().getName());
}
/**
* 开启后台 workThread 做耗时操作
*/
@Override
public Cursor loadInBackground() {
// TODO Auto-generated method stub
Log.i("=loadInBackground==", Thread.currentThread().getId()+" "+Thread.currentThread().getName());
Cursor cursor = db.rawQuery("select * from person", null);
return cursor;
}
/**
* 执行loadInBackground完成之后 调用该方法 接受 loadInBackground的值
*/
@Override
public void deliverResult(Cursor data) {
// TODO Auto-generated method stub
Log.i("=deliverResult==", Thread.currentThread().getId()+" "+Thread.currentThread().getName());
super.deliverResult(data);
}
}