首先一起看一下整个LoaderManager类文件, 尼玛..
源码:http://www.oschina.net/code/explore/android-4.0.1/core/java/android/app/LoaderManager.java
先来看下getLoaderManager方法:
public LoaderManager getLoaderManager() {
if (mLoaderManager != null) {
return mLoaderManager;
}
mCheckedForLoaderManager = true;
mLoaderManager = getLoaderManager(-1, mLoadersStarted, true);
return mLoaderManager;
}
LoaderManagerImpl getLoaderManager(int index, boolean started, boolean create) {
if (mAllLoaderManagers == null) {
mAllLoaderManagers = new SparseArray<LoaderManagerImpl>();
}
LoaderManagerImpl lm = mAllLoaderManagers.get(index);
if (lm == null) {
if (create) {
lm = new LoaderManagerImpl(this, started);
mAllLoaderManagers.put(index, lm);
}
} else {
lm.updateActivity(this);
}
return lm;
}
可以很清晰的看到,实际上是获取了一个LoaderManagerImpl实例。很自然,接下来应该看下initLoader()方法了
final SparseArray<LoaderInfo> mLoaders = new SparseArray<LoaderInfo>();
@SuppressWarnings("unchecked")
public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
if (mCreatingLoader) {
throw new IllegalStateException("Called while creating a loader");
}
LoaderInfo info = mLoaders.get(id);
if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
if (info == null) {
// Loader doesn't already exist; create.
info = createAndInstallLoader(id, args, (LoaderManager.LoaderCallbacks<Object>)callback);
if (DEBUG) Log.v(TAG, " Created new loader " + info);
} else {
if (DEBUG) Log.v(TAG, " Re-using existing loader " + info);
info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
}
if (info.mHaveData && mStarted) {
// If the loader has already generated its data, report it now.
info.callOnLoadFinished(info.mLoader, info.mData);
}
return (Loader<D>)info.mLoader;
}
一切的一起从这个方法开始了。
从代码中可以看到,它会先到mLoaders中查找这个Loader,如果该id的Loader还不存在,那就执行createAndInstallLoader方法创建;
private LoaderInfo createLoader(int id, Bundle args,
LoaderManager.LoaderCallbacks<Object> callback) {
LoaderInfo info = new LoaderInfo(id, args, (LoaderManager.LoaderCallbacks<Object>)callback);
Loader<Object> loader = callback.onCreateLoader(id, args);
info.mLoader = (Loader<Object>)loader;
return info;
}
private LoaderInfo createAndInstallLoader(int id, Bundle args,
LoaderManager.LoaderCallbacks<Object> callback) {
try {
mCreatingLoader = true;
LoaderInfo info = createLoader(id, args, callback);
installLoader(info);
return info;
} finally {
mCreatingLoader = false;
}
}
void installLoader(LoaderInfo info) {
mLoaders.put(info.mId, info);
if (mStarted) {
// The activity will start all existing loaders in it's onStart(),
// so only start them here if we're past that point of the activitiy's
// life cycle
info.start();
}
}
可以看到,createAndInstallLoader方法又去调用了createLoader 和installLoader方法。createLoader 执行回调onCreateLoader以获取你的Loader实例,而installLoader会执行startLoading方法,以启动你的Loader。
注意,此处回调了LoaderCallBack的onCreateLoader方法!!
如果已经存在,就把callback参数传给LoaderInfo对象;
接下来调用LoaderInfo的callOnLoadFinished方法!
void callOnLoadFinished(Loader<Object> loader, Object data) {
if (mCallbacks != null) {
String lastBecause = null;
if (mActivity != null) {
lastBecause = mActivity.mFragments.mNoTransactionsBecause;
mActivity.mFragments.mNoTransactionsBecause = "onLoadFinished";
}
try {
if (DEBUG) Log.v(TAG, " onLoadFinished in " + loader + ": "
+ loader.dataToString(data));
mCallbacks.onLoadFinished(loader, data);
} finally {
if (mActivity != null) {
mActivity.mFragments.mNoTransactionsBecause = lastBecause;
}
}
mDeliveredData = true;
}
}
注意,此处回调了LoaderCallBack的onLoadFinished方法!!
那还有个onLoaderReset 方法, 什么时候调用呢? 可以明确的告诉你,这个方法只有在Loader被销毁的时候才会调用。
getLoaderManager().destroyLoader(int)
getLoaderManager().restartLoader(int arg0, Bundle arg1, LoaderCallbacks<D> arg2)
分享到:
相关推荐
老罗android视频开发源码和ppt 这是视频配套的源码与PPT, 分了不同的小包 老罗写的, 听说叫罗升阳。
Android下使用loaderManager,详情可以参见博客:http://www.cnblogs.com/plokmju/p/android_Loaders.html
一个用LoaderManager查询sd的所有图片和查询手机上的联系人的demo
package cheng.app....import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.text.TextUti
Android 中 Loader 及 LoaderManager 的使用
Android的设计之中,任何耗时的操作都不能放在UI主线程之中。所以类似于网络操作等等耗时的操作都需要使用异步的实现。而在ContentProvider之中,也有可能...(2)loaderManager的事件回调接口, LoaderManager.Loader
老罗Android开发视频教程14.2 LoaderManager的使用二 代码
打开本地图像 ... 导入 android.database.Cursor; 导入 android.graphics.Bitmap;... 导入 android.support.v4.app.LoaderManager; 导入 android.support.v4.content.CursorLoader; 导入 android.support.v4.content.Lo
Loader的初始化非常简单,Activity提供了获取LoaderManager的接口,之后调用LoaderManager的initLoader即可。initLoader接受三个参数:Loader的唯一标识符ID,用来区分多个Loader;传递给Loader的参数,可选;
LoaderManager.LoaderCallbacks是3.0之后出现的新特性,通过LoaderManager.LoaderCallbacks接口可以很轻松的实现异步加载数据到Fragment或Activity 中,Loaders提供了回调机制onLoadFinished()通知最终的运行结果,...
本示例演示了在Android中如何使用Loader异步读取联系人数据,并且通过使用support v4支持低版本的Android系统(1.6+)。 该源码的详细解读可参见博文http://blog.csdn.net/iispring/article/details/48834767
##LoaderManager1,可以增加删除数据,并及时刷新2,用到了内容观察者来对数据库增删改除3,LoaderManager异步加载数据(google推荐)##链接
LoaderManagerExample
###使用了ContentProvider+LoaderManager+CursorAdapter,为ListView提供数据 ###为什么要这样做 传统的ListVIew更新数据操作麻烦,且在不同的线程中会产生问题 使用ContentProvider可以简化、结构化数据操作 通过...
弃用(可参考)toasts2:丰富多彩的Toastupdateapk:XML配置升级APKuploadpic:最强微信图片上传(无bug版 修改了loaderManager两次finish的问题)usersdk:登录回调处理逻辑跳转widget: 1.AlertView:仿IOS弹窗 2...
Android 3.0引入了CursorLoader实现异步加载数据,... implements LoaderManager.LoaderCallbacks<Cursor> { // This is the Adapter being used to display the list's data SimpleCursorAdapter mAdapter; // T
LoaderManager加载本地图片信息,Glide加载显示图片。 PopupWindow显示相册目录 RecyclerView显示图片列表,ViewPager显示图片预览。
6.17 ImageView从网络上获取图像 6.18 DatePicker输入日期控件的使用 6.19 时间对话框的使用 6.20 ProgressBar进度条的使用 6.21 RatingBar评分控件的使用 6.22 ScrollView垂直滚动控件的使用 6.23 ...
两个示例,一个是用loadermanager异步查询,另一个是同步查询,查询在主线程上做