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
,这将不得不查找片段。它可能存在也可能不存在(在本例中,忽略结果)。不管怎样,我现在留下了一个正确的答案。