Android片段-使用活动';s loadermanager而不是Fragment';s可以吗?

Android片段-使用活动';s loadermanager而不是Fragment';s可以吗?,android,fragment,android-loadermanager,android-loader,Android,Fragment,Android Loadermanager,Android Loader,给定一个片段,该片段使用加载程序从数据库加载(大量)数据 问题: 我有一个寻呼机适配器,当用户离开持有片段的选项卡时,它会销毁片段,当用户回到该选项卡时,它会重新创建片段。由于这种重新创建,每次都会创建一个新的加载程序,并且每次都会加载数据 问题: 为了避免每次创建片段时都重新创建加载程序,可以在片段的onActivityCreated方法中使用getActivity.getSupportLoaderManager.initLoader(loaderId,null,false) 我已经试过了,测

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

问题:

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

问题:

为了避免每次创建片段时都重新创建加载程序,可以在片段的
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)

因此,即使您可以按要求执行操作,直接从片段调用它可能是一种更好的方法


免责声明:我只检查了最新版本的源代码,但我不认为它会有太大的不同

请问您为什么不保留片段?似乎您需要的是在片段中创建加载程序,并使用setRetainInstance(true)创建片段。 在本例中,请记住在添加片段时提供标记。
这样,即使活动配置发生更改,片段也会保留下来,并且只有视图会被重新创建,从而使加载程序保持活动状态。

我看不出这种方法有什么问题。确保每个片段使用唯一的id(除非您同意重用相同的加载程序),我已经确保id是唯一的。感觉不对。因为在创建加载程序时,片段本身注册为回调,如果系统破坏了片段,加载程序将重新加载数据并尝试调用
onLoadFinished()
方法,那么在活动中将调用
onLoadFinished
,这将不得不查找片段。它可能存在也可能不存在(在本例中,忽略结果)。不管怎样,我现在留下了一个正确的答案。