LoaderManager
每个Activity或者Fragment只有一个LoaderManager,它可以根据前两者的生命周期来管理若干个Loader。
LoaderManager.LoaderCallbacks
它提供三个接口和LoaderManager进行互动:onCreateLoader(怎么创建一个Loader)、onLoadFinished(当某个Loader加载完毕)、onLoaderReset(当某个Loader重置时)。
CursorLoader
负责异步查询ContentResolver并提供Cursor。它是Loader的子类AsyncTaskLoader的子类。也可以自定义一个Loader的子类来替代它。
它们和ListView、SimpleCursorAdapter是很好的搭档,以下为示例:
package com.company.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.app.LoaderManager;
import android.content.Loader;
import android.database.Cursor;
import android.content.CursorLoader;
public class ExampleActivity extends Activity
implements LoaderManager.LoaderCallbacks<Cursor> {
private SimpleCursorAdapter mSimpleCursorAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.for_activity);
ListView listView = (ListView) findViewById(R.id.of_list_view);
// 实例化适配器。暂时先不设置Cursor
mSimpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.for_list_view,
/* Cursor */ null, // 将由onCreateLoader()创建的Cursor替代
/* String[] */ fromColumns, // 欲映射的列名集合
/* int[] */ toViews, // 欲映射的控件ID(R.id.xxx)集合
0);
// 给ListView设置适配器。当适配器的Cursor更新后,
// 将会根据上述映射关系把数据提供给ListView
listView.setAdapter(mSimpleCursorAdapter);
// 获取LoaderManager并初始化一个Loader。
// 若initLoader()第一个参数所指定ID的Loader不存在,
// 则会调用onCreateLoader()
getLoaderManager().initLoader(/* id */ 0, null, this);
// 给ListView设置点击事件监听器
listView.setOnItemClickListener(mOnItemClickListener);
// 过了一段时间之后,如果确定适配器所依赖的数据已更新,可以调用:
mSimpleCursorAdapter.notifyDataSetChanged();
}
// LoaderCallbacks的三个方法之一:创建一个Loader。
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// 指定如何创建Cursor,以供mSimpleCursorAdapter使用。
// 它会利用下述参数来调用ContentResolver.query()
return new CursorLoader(this,
URI, // Uri 类型,相当于表名
PROJECTION, // String[] 类型,欲查询的列名集合
SELECTION, // String 类型,WHERE语句
SELECTION_ARGS, // String[] 类型,WHERE语句的参数
SORT_ORDER); // String 类型,排序语句
}
// LoaderCallbacks的三个方法之一:加载完某个Loader之后
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// 当异步加载完Cursor后,更新mSimpleCursorAdapter。
// 接着后者会去通知ListView说有数据来了。
// 旧的Cursor将在本方法返回后由系统自动关闭。
mSimpleCursorAdapter.swapCursor(data);
}
// LoaderCallbacks的三个方法之一:当某个Loader重置时
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// 一旦mSimpleCursorAdapter绑定的Cursor被close()或者设为null,
// ListView将无数据可显示
mSimpleCursorAdapter.swapCursor(null);
}
// ListView的点击事件监听器
private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
// 处理点击事件
}
};
}
参考资料:
Android > API Guides > Activities > Loaders
https://developer.android.com/guide/components/fragments.html