您的位置:首页 > 其它

7-19-2 Loaders

2016-07-25 13:58 190 查看
Loaders
Loders是Android3.0开始引入的,可以在Activity和Fragment中,用来异步载入数据和检测数据
变化。
API提供以下类:
LoaderManager --加载管理器
Loader --加载器(抽象类)
LoaderManager.LoaderCallbacks --加载后的回调接口
CursorLoader --加载器的具体实现类(用来异步加载通过ContentProvider提供的数据)
是AsyncTaskLoader的子类
AsyncTaskLoader 实现异步加载的抽象类

具体在开发中使用以下两个类
一、使用CursorLoader加载数据:
<1>准备工作
通过一个按钮事件,向数据库添加一条记录,实时加载到一个ListView组件上
private static final int LOADER_CURSOR_ID = 0x1;
private ListView listView_data;
private SimpleCursorAdapter scAdatper;
private DatabaseAdapter dbAdapter;
Loader<Cursor> loader;
listView_data = (ListView) findViewById(R.id.listView_data);

<2>的onCreate方法中初始化:
//SimpleCursorAdapter用来绑定数据源类型为Cursor
//参数:Context,选项布局ID,数据源Cursor,要显示的字段列表(数组),
//字段列表值对应填充的组件ID,标记(当前适配器注册为内容观察者)
scAdatper = new SimpleCursorAdapter(this,R.layout.list_item,
null,
new String[]{DBMetadata.Person._ID,
DBMetadata.Person.NAME,
DBMetadata.Person.AGE},
new int[]{R.id.textView_id,
R.id.textView2_name,
R.id.textView3_age},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
//初始化LoaderManager(参数:ID,Bundle(给加载器传参),回调接口)
listView_data.setAdapter(scAdatper);
loader = getLoaderManager().initLoader(LOADER_CURSOR_ID,null,this);

<3>Activity实现加载器回调接口:
LoaderManager.LoaderCallbacks<Cursor>
实现三个回调方法:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person");
CursorLoader cursorLoader = new CursorLoader(this,uri,null,null,null,null);
return cursorLoader;
}
//完成数据加载后回调的方法
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
scAdatper.swapCursor(data);
}
//重置加载器时回调
@Override
public void onLoaderReset(Loader<Cursor> loader) {
scAdatper.swapCursor(null);
}

二、使用AsyncTaskLoader加载数据:
通过AsyncTaskLoader我们可以实现自己的异步加载数据功能,比如加载网络数据、读取本地
文件,加载本地数据库数据等比较耗时的操作。通常我们可以通过封装异步加载,来方便统一
的实现。
比如以下示例,通过封装异步加载数据功能,来动态实时加载数据库查询的操作。
<1>创建一个自己异步加载数据类:
public class MyLoader implements LoaderManager.LoaderCallbacks<ArrayList<Person>>{
private Context context;
private DatabaseAdapter dbAdapter;
private MyAsyncTaskLoader myAsyncTaskLoader;
private ResultListener resultListener;
public MyLoader(Context context, LoaderManager lm,ResultListener listener){
this.context = context;
this.resultListener = listener;
dbAdapter = new DatabaseAdapter(context);
//初始化LoaderManager
lm.initLoader(1,null,this);
}

public void load(){
//当数据变化时通过该方法通知加载器重新加载数据
myAsyncTaskLoader.onContentChanged();
}

private static class MyAsyncTaskLoader extends AsyncTaskLoader<ArrayList<Person>>{
private DatabaseAdapter dbAdapter;
public MyAsyncTaskLoader(Context context,DatabaseAdapter dbAdapter) {
super(context);
this.dbAdapter = dbAdapter;
}

@Override
public ArrayList<Person> loadInBackground() {
//该方法在数据变化后重新查询数据库,会回调onLoadFinished方法
return dbAdapter.findAll();
}

// @Override
// public void deliverResult(ArrayList<Person> data) {
// super.deliverResult(data);
// }
//
// @Override
// protected void onStartLoading() {
// super.onStartLoading();
// }
}

@Override
public Loader<ArrayList<Person>> onCreateLoader(int id, Bundle args) {
// 创建异步加载器
myAsyncTaskLoader = new MyAsyncTaskLoader(context,dbAdapter);
return myAsyncTaskLoader;
}

@Override
public void onLoadFinished(Loader<ArrayList<Person>> loader, ArrayList<Person> data) {
//数据加载完成后通过回调接口把数据传递到界面,需要界面类实现回调接口
resultListener.success(data);
}

@Override
public void onLoaderReset(Loader<ArrayList<Person>> loader) {
myAsyncTaskLoader.reset();//重置Loader
}

public static interface ResultListener{
public void success(ArrayList<Person> data);
}
}

<2>在界面使用自定义数据加载器加载数据:
public void addClick(View v){
//向数据库添加数据后通知加载重新加载数据
dbAdapter.save(new Person("dalei",21));
loader.load();
}

//该方法初始化自定义数据加载器,可以在onCreate方法中调用
private void init() {
loader = new MyLoader(this, getLoaderManager(),
new MyLoader.ResultListener() {
@Override
public void success(ArrayList<Person> data) {
//成功返回加载的数据后设置到适配器后更新UI
pa.setPersons(data);
pa.notifyDataSetChanged();
}
});

}

小结:
通过Android3.0提供的加载器Loaders,我们可以封装自己的数据加载器组件,便于在
程序中便利的加载数据并处理结果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: