是否总是需要从片段中的 onCreate 初始化加载器?如果加载器的关键参数依赖于另一个加载器的结果怎么办?
即您有 2 个装载机:LoaderA 和 LoaderB。LoaderB 需要 LoaderA 的结果才能运行。LoaderA 和 LoaderB 都在片段的 onCreate 中初始化,但 LoaderB 没有给出任何参数,因此它故意失败。一旦 LoaderA 完成,LoaderB 将使用新参数重新启动,以便它可以执行所需的请求。
片段中的加载器初始化:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_A, new Bundle(), this);
getLoaderManager().initLoader(LOADER_B, null, mLoaderBCallback);
}
回调片段中的 LOADER_A:
@Override
public Loader<MyResultObject> onCreateLoader(int id, Bundle args) {
return new LoaderA(getActivity(), args);
}
@Override
public void onLoadFinished(Loader<MyResultObject> loader, final MyResultObject result) {
if (result != null) {
Bundle args = new Bundle();
args.putInt("id", result.getId());
getLoaderManager().restartLoader(LOADER_B, args, mLoaderBCallback);
}
}
片段中 mLoaderBCallback 的定义:
private LoaderBCallback mLoaderBCallback = new LoaderBCallback();
(LoaderBCallback 的实现并不重要,它只是标准的 LoaderCallbacks 接口,它创建 LoaderB 的实例并在加载器完成时处理。)
LoaderB 类(请原谅此类定义的任何潜在编译器错误,它只是一个示例):
public class LoaderB<List<AnotherResultObject>> extends AsyncTaskLoader<List<AnotherResultObject>> {
private Bundle mArgs;
public LoaderB(Context context, Bundle args) {
super(context);
mArgs = args;
}
@Override
public List<AnotherResultObject> loadInBackground() {
if (mArgs == null) {
// bail out, no arguments.
return null;
}
// do network request with mArgs here
return MyStaticClass.performAwesomeNetworkRequest(mArgs);
}
// boiler plate AsyncTaskLoader stuff here
......
}
有没有更好的办法?我们可以不使用 LoaderB 的 initLoader 吗?
编辑:我的印象是加载程序总是必须在 onCreate 中初始化,以便它们可以处理配置更改。这可能仅适用于活动中的加载程序。在 Fragments 中创建的加载器无论在哪里初始化都会得到管理吗?