我注意到使用Android Loaders和Fragments的奇怪情况.当我调整方向更改onLoadFinished后调用LoaderManager.initLoader()时(尽管文档建议我应该为此做好准备),但在此之后调用它两次.以下链接指向相同情况的Google群组中的帖子https://groups.google.com/forum/?fromgroups#!topic/android-developers/aA2vHYxSskU.我编写了示例应用程序,其中我只在Fragment.onActivityCreated()中初始化简单的Loader来检查是否会发生这种情况.有人注意到了吗?
我想弄清楚我是否在装载机方面做错了.我正在使用支持库,我有一个片段,在onCreate()中调用initLoader()将其自身设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并提供结果,因为它已经拥有数据.
如果我只调用init一次(在首次启动Fragment时),它不会将自己设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用.好像onLoadFinished应该只被调用一次,因为onLoadFinished()可以完成一些昂贵的事情(例如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init.
任何人都对此问题有任何见解?
android loader android-fragments android-loadermanager android-fragmentactivity
我有一个非常简单的片段与ListView,CursorLoader和CursorAdapter.一切都在单一活动中(只是切换片段).我的问题是onLoadFinished()在某些情况下根据我调用initLoader()的位置被调用两次.那些情况是:
当initLoader()放入onCreateView()时,onAoseCreated()(在文档中推荐)onLoadFinished()在配置更改后被调用两次.有解释为什么Rudik Krasniynos.但是当从backstack弹出更新的片段时,onLoadFinished()只被调用一次.
当initLoader()放在onResume()/ onStart()方法中时,上面的情况相反.两次调用onLoadFinished()用于弹出backstack,另一次用于配置更改.
所以问题是在没有调用onLoadFinished()两次的情况下初始化Loader的地方或方法,或者检查两次不是init Loader的内容.谢谢!
替换片段的代码:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.root_view, fragment, tag);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
CursorAdapter的代码:
//onCreateView
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0);
mList.setAdapter(mAdapter);
//in other/same lifecycle callbacks
getLoaderManager().initLoader(ID, null, this);
Run Code Online (Sandbox Code Playgroud)
我正在使用支持库v18.