LoaderManager
外部接口initLoader:起始
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;
}
- mCreatingLoader代表当前LoaderManager正处于创建Loader的状态,这个时候进入initLoader属于冲突。
- LoaderInfo为LoaderManager内部保存Loader信息的一个类,mLoaders保存了此LoaderManager加载过的Loader,需要注意:一个ID对应一个Loader。
- info获取不到,说明这次是一个新的Loader进来,需要通过createAndInstallLoader进行创建和安装,参数即为initLoader的参数。
- 如果获取到了info,说明这是一个已经存在过的Loader,只需要重新对callback回调进行重新赋值即可。
- 若获取到的Loader已经开始,并且产生了有效数据,则执行LoaderInfo的callOnLoadFinished方法上报数据。
- 最终返回LoaderInfo中的Loader信息。
LoaderInfo声明了Loader.OnLoadCompleteListener接口,并且保存了一个Loader的几乎所有信息和状态。
LoaderInfo的构造函数
public LoaderInfo(int id, Bundle args, LoaderManager.LoaderCallbacks<Object> callbacks) {
mId = id;
mArgs = args;
mCallbacks = callbacks;
}
createAndInstallLoader
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;
}
}