loader 是Android 3.0之后引入的API,可以在activity 或者 fragment中方便的异步装载数据.而且可以monitor 数据,当monitor的数据更新是返回最新的结果。
如何开始一个loader呢?
一般在activity 或者fragment 中用loader的话,先通过getLoaderManager().initLoader(0, null, this);
public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
599 if (mCreatingLoader) {
600 throw new IllegalStateException("Called while creating a loader");
601 }
602
603 LoaderInfo info = mLoaders.get(id);
604
605 if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
606
607 if (info == null) {
608 // Loader doesn't already exist; create.
609 info = createAndInstallLoader(id, args, (LoaderManager.LoaderCallbacks<Object>)callback);
610 if (DEBUG) Log.v(TAG, " Created new loader " + info);
611 } else {
612 if (DEBUG) Log.v(TAG, " Re-using existing loader " + info);
613 info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
614 }
615
616 if (info.mHaveData && mStarted) {
617 // If the loader has already generated its data, report it now.
618 info.callOnLoadFinished(info.mLoader, info.mData);
619 }
620
621 return (Loader<D>)info.mLoader;
622 }
第一个参数id 是用于和loaderInfo 映射,其中mLoader是一个SpareArray数据。从initLoader中可以看到如果没有从mLoader中查到LoaderInfo的话,则info==null 这个条件成立,则调用createAndINstallLoader建立一个新的LoaderInfo。并通过createAndINstallLoader->installLoader 中调用mLoader.put(info.id,info).来建立新的id和info的映射。
第二个个参数args 会保存到LoaderInfo中。
第三个参数一般传this,因为activity 一般会实现LoaderManager Callbacks.
LoaderManager.LoaderCallbacks 有三个接口分别如下:
onCreateLoader() — 用给定的id创建一个新的loader
onLoadFinished() — 当数据完成加载时
onLoaderReset() — 重启一个loader
如果创建LoaderInfo后,需要monitor的数据已经产生则会在618行调用LoaderManager Callbacks onLoadFinished。
重启loader:
有时候你想丢弃就的数据重启loader,可以调用下面的接口
getLoaderManager().restartLoader(0, null, this);
如何开始一个loader呢?
一般在activity 或者fragment 中用loader的话,先通过getLoaderManager().initLoader(0, null, this);
public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
599 if (mCreatingLoader) {
600 throw new IllegalStateException("Called while creating a loader");
601 }
602
603 LoaderInfo info = mLoaders.get(id);
604
605 if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
606
607 if (info == null) {
608 // Loader doesn't already exist; create.
609 info = createAndInstallLoader(id, args, (LoaderManager.LoaderCallbacks<Object>)callback);
610 if (DEBUG) Log.v(TAG, " Created new loader " + info);
611 } else {
612 if (DEBUG) Log.v(TAG, " Re-using existing loader " + info);
613 info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
614 }
615
616 if (info.mHaveData && mStarted) {
617 // If the loader has already generated its data, report it now.
618 info.callOnLoadFinished(info.mLoader, info.mData);
619 }
620
621 return (Loader<D>)info.mLoader;
622 }
第一个参数id 是用于和loaderInfo 映射,其中mLoader是一个SpareArray数据。从initLoader中可以看到如果没有从mLoader中查到LoaderInfo的话,则info==null 这个条件成立,则调用createAndINstallLoader建立一个新的LoaderInfo。并通过createAndINstallLoader->installLoader 中调用mLoader.put(info.id,info).来建立新的id和info的映射。
第二个个参数args 会保存到LoaderInfo中。
第三个参数一般传this,因为activity 一般会实现LoaderManager Callbacks.
LoaderManager.LoaderCallbacks 有三个接口分别如下:
onCreateLoader() — 用给定的id创建一个新的loader
onLoadFinished() — 当数据完成加载时
onLoaderReset() — 重启一个loader
如果创建LoaderInfo后,需要monitor的数据已经产生则会在618行调用LoaderManager Callbacks onLoadFinished。
重启loader:
有时候你想丢弃就的数据重启loader,可以调用下面的接口
getLoaderManager().restartLoader(0, null, this);