Android Fragment - 使用Activity的LoaderManager而不是Fragment的,这样做可以吗?

7

给定一个从数据库中使用加载器加载(大量)数据的片段。

问题:

我有一个分页适配器,当用户离开包含它的选项卡时销毁该片段,并在用户返回该选项卡时重新创建它。由于这种重建,每次都会创建一个新的加载器并加载数据。

问题:

为了避免每次创建片段时重新创建加载器,是否可以在片段的onActivityCreated方法中使用getActivity.getSupportLoaderManager.initLoader(loaderId, null, false)

我已经尝试过并测试了它,似乎运行正常。但我还不确定这是正确的做法。


我看不出这种方法有什么问题。请确保每个片段使用唯一的ID(除非您可以重复使用相同的加载器)。 - Pedro Loureiro
我已经确保了id的唯一性。但这感觉不对。因为当创建loader时,片段会将自己注册为回调函数,如果系统已经销毁了该片段,加载器重新加载数据并尝试调用onLoadFinished()方法会怎样呢? - 500865
onLoadFinished 将在 Activity 中被调用,该 Activity 必须查找片段。它可能存在或不存在(在这种情况下,只需忽略结果)。无论如何,我现在留下了一个适当的答案。 - Pedro Loureiro
2个回答

2

实际上,查看源代码后,你最终执行相同的操作。

Fragment.getLoaderManager:

/**
 * Return the LoaderManager for this fragment, creating it if needed.
 */
public LoaderManager getLoaderManager() {
    if (mLoaderManager != null) {
        return mLoaderManager;
    }
    if (mActivity == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to Activity");
    }


    mCheckedForLoaderManager = true;
    mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true);
    return mLoaderManager;
}

mWho基本上是片段ID。

final void setIndex(int index, Fragment parent) {
    mIndex = index;
    if (parent != null) {
        mWho = parent.mWho + ":" + mIndex;
    } else {
        mWho = "android:fragment:" + mIndex;
    }
}
Activity.getLoaderManager()的区别在于谁将成为(root)
因此,即使您可以按照您的要求执行此操作,但直接从Fragment调用可能是更好的方法。
参考链接: 声明:我只检查了最新版本的源代码,但不希望它有太大差异。

0
我可以问一下为什么您不直接保留Fragment吗?看起来您需要在Fragment中创建Loader并使用setRetainInstance(true)创建Fragment。在这种情况下,请记得在添加Fragment时提供一个TAG。这样,即使活动配置更改,该Fragment也将存活,只有视图将被重新创建,从而使您的Loader保持活动状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接