继续总结加载器
加载器可以支持在Activity或片段中异步加载数据,加载器具有以下特征:
可用于每个Activity和Fragment;
支持异步加载数据;
监控其数据源并在内容变化时传递新结果;
在某一配置更改后重建加载器时,会自动重新连接上一个加载器的游标,故无需重新查询其数据。
在应用中使用加载器:
使用加载器的应用通常包括:
*Activity或Fragment
*LoaderManager的实例
*一个CursorLoader,用于加载由ContentProvider支持的数据,可以实现自己的Loader或AsyncTaskLoader子类,从其他源中加载数据
*一个LoaderManager.LoaderCallbacks实现,可以使用它来创建新加载器,并管理对现有的加载器的引用。
*一个显示加载器数据的方法,如SimpleCursorAdapter。
*使用CursorLoader时的数据源,如ContentProvider。
启动加载器:
LoaderManager可在Activity或Fragment内管理一个或多个Loader实例,每个Activity或片段中只有一个LoaderManager。为了初始化加载器以及实现一个Loader类(如CursorLoader),始终需要引入LoaderManager。
通常,在Activity的onCreate()方法或片段的onActivityCreated()方法内初始化Loader。
getLoaderManager().initLoader(0,null,this);
initLoader()方法采用以下参数:
*用于标识加载项的唯一ID,此例中ID为0
*在构建时提供给加载器的可选参数,此例中为null
*LoaderManager.LoaderCallbacks实现,LoaderManager将调用此实现来报告加载器事件,此例中,本地实现LoaderManager.LoaderCallbacks接口,故它会传递对自身的引用this。
initLoader()调用确保加载器已初始化且处于活动状态,将可嫩有两种结果:
*若ID指定的加载器已存在,则将重复使用上次创建的加载器。
*若ID指定的加载器不存在,则initLoader()将触发LoaderManager.LoaderCallbacks方法onCreateLoader().
重启加载器:
当使用initLoader()时,将使用含有指定ID的现有加载器,若没有,则会创建一个,但有时,想舍弃这些旧数据并重新开始的话,调用restartLoader()。例如,当用户查询更改时,此SearchView.OnQueryTextListener实现将重启加载器,以便它能够使用修订后的搜索过滤器执行新查询:
public boolean onQueryTextChanged(String newText) {
mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, this);
return true;
}
使用LoaderManager回调:
LoaderManager.LoaderCallback是一个支持客户端与LoaderManager交互的回调接口。
加载器(特别是CursorLoader)在停止运行后,仍需保持其数据,这样,应用即可保留Activity或片段的onStop()和onStart()方法中的数据。当用户返回应用时,无需等待重新加载这些数据,可以使用LoaderManager.LoaderCallback方法了解何时创建新加载器,并告知应用何时停止使用加载器的数据。LoaderManager.LoaderCallbacks包括以下方法:
onCreateLoader()---针对指定的ID进行实例化并返回新的Loader
onLoadFinished()---将在先前创建的加载器完成加载时调用
onLoaderReset()---将在先前创建的加载器重置且数据因此不可用时调用