除了Asynctask用于异步加载之外,我们也经常使用Loader进行异步加载,使用它有个好处,我们当数据源进行更新的时候,Loader可以动态的监听改变,
并且配置改变的时候,会自动重连,省掉很多的功夫。
Loader 存在于Fragment和Activity中,下面我们来说一下它的使用。
**LoaderManager**用于管理Loader,可以在Fragemnt和Activity中通过getLoaderManager获取对象实例。
初始化Loader有两种方式,一种是通过初始化的方式----initLoader(id,args,Callback);另一种方式则是通过重新打开的方式----
restartLoader(id,args,Callback);
Loader一般我们经常使用的是它的两个子类,CursorLoader和AsyncTaskLoader.
CursorLoader用于加载contentProvider里面提供的数据,可以实现动态监听。
AsyncTaskLoader则是用于异步任务的加载。
首先说一下initLoader(id,args,Callback):
id代表当前Loader的标识,虽然一个Fragment或者Activity中只存在一个LoaderManager,但是可以存在多个Loader,此id用于标识不同的Loader;
args则是传递给Loader的Bundle类型的参数。
CallBack则是一个回调,签名的参数则是由它的oncreate(int id,Bundle args)中的两个参数所体现。
下面说一下回调,
onCreate() -- 创建一个Loader并且返回给LoaderManager(一般使用CursorLoader)
onLoaderFinished() -- Loader加载完成以后调用 ,返回结果
onLoaderReset() -- Loader重置以后,不加载数据
代码示例:
LoaderManager manager = getLoaderManager();
manager.initLoader(
1,
null,
new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public android.content.Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = Uri.parse("content://com.ly.loader_provider/girls");
return new CursorLoader(MainActivity.this,
uri,
null,
null,
null,
null);
}
@Override
public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(android.content.Loader<Cursor> loader) {
adapter.swapCursor(null);
}
});