文章目录
  1. 1. 使用

ContentProvider查询数据比较耗时,在UI线程中查询可能会ANR,通过CursorLoader来实现,异步查询数据。

使用

CursorLoader依靠ContentProvider在后台执行一个异步的查询操作,并且返回数据给调用它的Activity或者Fragment。

  1. 定义使用CursorLoader的Activity
    必须实现LoaderCallbacks接口,CursorLoader会触发这些回调方法。

    1
    2
    3
    public class OtherFragment extends FragmentActivity implements LoaderManager.LoaderCallback<Cursor>{
    ...
    }
  2. 初始化查询
    为了初始化查询,需要执行LoaderManager.initLoader()初始化后台任务。可以在onCreate()或者onCreateView()中触发这个方法。

    1
    getLoaderManager().initLoader(1,null,this); // 第一个参数为标志 第二个为可选的参数供Loader构造 第三个为Loader接口

注:getLoaderManager()只能在Fragment类中调用,在FragmentActicity中应该使用getSupportLoaderManager()

  1. 开始查询
    一旦初始化完成,它会回调onCreateLoader()方法。为了启动查询任务,在这个方法需要返回CursorLoader
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public Loader<Cursor> onCreateLoader(int loaderId,Bundle bundle){
    switch(loaderID) {
    case URL_LOADER: // 设置的标示符
    return cursorLoader;
    break;
    default:
    return null;
    }
    }

一旦获取查询任务的Loader对象,就会开始在后台查询任务,当查询完成之后,就会执行onLoadFinished()回调函数。

  1. 处理查询
    onLoadFinished()参数之一是Cursor,包含了查询的数据
    1
    2
    3
    4
    5
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // 通知Adapter更改数据
    mAdapter.changeCursor(data);
    }

在Cursor失效时,CursorLoader会被重置,通常会发生在Cursor相关的数据改变的时候,在重新执行查询操作之前,系统会执行onLoaderReset()方法。在这个方法中,应该删除当前Cursor上的所有数据,避免发生内存泄露。

1
2
3
4
5
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//
mAdapter.changeCursor(null);
}

文章目录
  1. 1. 使用