OnLoadFinished()调用两次

时间:2013-02-06 00:59:20

标签: android android-fragments loader android-fragmentactivity android-loadermanager

我正在试图弄清楚我是否在装载机方面做错了。我正在使用支持库,我有一个片段,它在onCreate()中调用initLoader()将自己设置为LoaderCallbacks,但是在旋转时它会在onLoadFinished()中接收两次结果,一次调用init (并且它已经拥有数据),并且一旦FragmentActivity循环遍历onStart()中的所有Loaders并传递结果,因为它已经拥有数据。

如果我只调用init一次(首次启动片段时),它不会将自身设置为Loader的回调,因此它根本不会接收对onLoadFinished的调用。好像onLoadFinished应该只被调用一次,因为onLoadFinished()可以完成一些昂贵的事情(比如清除列表适配器等),所以我只想弄清楚这是一个bug还是我是只是在错误的时间或其他地方调用init。

任何人都对此问题有任何见解?

5 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,原因是我的代码中有initLoaderrestartLoader。根据用户的操作,我的查询可能会发生变化,因此我需要重新启动我的加载程序。

解决方案是仅使用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()'之后的所有内容。