安卓学习之路之Loader的简单用法

来源:互联网 发布:hiv 知乎 编辑:程序博客网 时间:2024/05/23 20:45
1.laoder 英译:装载器
是从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);

}

}


0 0