我正在试图弄清楚我是否在装载机方面做错了。我正在使用支持库,我有一个片段,它在onCreate()中调用initLoader()将自己设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并传递结果,因为它已经拥有数据。
如果我只调用init一次(首次启动片段时),它不会将自身设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用。好像onLoadFinished应该只被调用一次,因为onLoadFinished()可以完成一些昂贵的事情(比如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init。
任何人都对此问题有任何见解?
答案 0 :(得分:3)
我遇到了类似的问题,原因是我的代码中有initLoader
和restartLoader
。根据用户的操作,我的查询可能会发生变化,因此我需要重新启动我的加载程序。
解决方案是仅使用restartLoader
,即使在onResume
回调方法中,将initLoader
替换为restartLoader
。
答案 1 :(得分:3)
这是一个相当古老的问题,但对于未来的读者,我有另一种解决方案。基本上我最终做的是重启加载器(如果存在的话)。
public void onActivityCreated(Bundle savedInstanceState) {
...
if(getLoaderManager().getLoader(Constants.LOADER_ID) == null) {
getLoaderManager().initLoader(Constants.LOADER_ID, null, this);
} else {
getLoaderManager().restartLoader(Constants.LOADER_ID, null, this);
}
...
}
这解决了我的问题,在屏幕旋转,加载器被触发了两次。有一点需要注意的是,只有Android和Android才需要这样做。 6,我测试过。 Android 6似乎根本没有这个问题。
答案 2 :(得分:2)
我遇到同样的问题,没有好的解决方案。 它似乎是Android框架中的错误,这里是类似的线程,其中提出的解决方案是将initLoader()放在onResume()中 - 我已经尝试过它并且它有效,onLoadFinished()只被调用一次: Android: LoaderCallbacks.OnLoadFinished called twice
答案 3 :(得分:2)
请参阅Android: LoaderCallbacks.OnLoadFinished called twice
上的帖子在ViewPager中重新启动片段时遇到了类似的问题。我的解决方案是通过调用
删除加载器(在onLoadFinished结束时)getLoaderManager().destroyLoader(LOADER_ID);
希望它有所帮助!
答案 4 :(得分:0)
它看起来像框架加载程序错误的实现/错误。 1。查看屏幕旋转后每种重要方法/回调从Log.v(LOG_TAG,...)消息中得到的信息:
...: .initLoader() 100
...: onStartLoading()
...: onLoadFinished()
...: updateUi(); articles size=10
...: loadInBackground()
...: getInputStream() - HttpRequest
...: onLoadFinished()
...: updateUi(); articles size=10
2。。正如您所见,在那里不需要'updateUi()'之后的所有内容。