Android Fragment - 使用活动的加载器管理器而不是Fragment的加载器。可以吗?



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

问题:

我有一个寻呼机适配器,当用户离开持有它的选项卡时,它会销毁碎片,当用户回到那个选项卡时,会重新创建它。由于这种重新创建,每次都会创建一个新的加载程序,每次都加载数据。

问题:

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

我试过了,测试过了,似乎效果很好。但我不相信这是正确的。

实际上,检查源代码,最终也会执行同样的操作。

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中调用它可能是更好的方法

  • 活动源代码
  • 片段源代码

免责声明:我只检查了最新版本的源代码,但我不希望它与有很大不同

我想问一下,为什么不保留Fragment?似乎您需要的是在Fragment中创建Loader,并使用setRetainInstance(true)创建片段。在这种情况下,请记住在添加片段时提供TAG。这样,即使活动配置发生更改,片段也会继续存在,并且只有视图会被重新创建,使加载程序处于活动状态。

最新更新