两次调用OnLoadFinished()。

问题描述 投票:20回答:5

我想知道我是否在Loader方面做错了什么。我正在使用支持库,我有一个Fragment,它在onCreate()中调用initLoader()将自己设置为LoaderCallbacks,但是在旋转时,它在onLoadFinished()中接收了两次结果,一次是调用init的结果(它已经有了数据),另一次是FragmentActivity在onStart()中循环浏览所有Loader的结果,因为它已经有了数据。

如果我只调用init一次(在第一次启动Fragment时),它就不会把自己设置为Loader的回调,所以它根本不会收到对onLoadFinished的调用。似乎onLoadFinished应该只被调用一次,因为在onLoadFinished()中可能会做一些昂贵的事情(比如清除列表适配器等),所以我只是想弄清楚这是一个bug,还是我只是在错误的时间调用init或其他东西。

有人对这个问题有什么见解吗?

android android-fragments loader android-fragmentactivity android-loadermanager
5个回答
3
投票

我有一个类似的问题,原因是我有 initLoaderrestartLoader 在我的代码中,我的查询可能会根据用户的操作而改变,所以我需要重新启动我的加载器。根据用户的操作,我的查询可能会改变,所以我需要重新启动我的加载器。

解决办法是只使用 restartLoader,即使在 onResume 回调方法替换 initLoaderrestartLoader.


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 < 6上测试。Android 6似乎没有这个问题。


2
投票

我自己也遇到了同样的问题,但没有好的解决方案,这似乎是Android框架的bug,这里有一个类似的帖子,其中提出的解决方案是将initLoader()放在onResume()中--我已经试过了,它是有效的,onLoadFinished()只被调用一次。我试过了,它是有效的,onLoadFinished()只被调用一次:Android: LoaderCallbacks.OnLoadFinished被调用了两次。


2
投票

参见我的帖子 Android.LoaderCallbacks.OnLoadFinished被调用两次。LoaderCallbacks.OnLoadFinished被调用两次

我在ViewPager中重启Fragments时也遇到了类似的问题。我的解决方案是,一旦我完成了加载器(在onLoadFinished结束时),就通过调用

getLoaderManager().destroyLoader(LOADER_ID);

希望能帮到你


0
投票

这看起来像是框架Loader的错误实现bug。1. 看看我从Log.v(LOG_TAG,...)中得到的消息,从屏幕旋转后的每个重要方法callback。

...: .initLoader() 100
...: onStartLoading()
...: onLoadFinished()
...: updateUi(); articles size=10
...: loadInBackground()
...: getInputStream() - HttpRequest
...: onLoadFinished()
...: updateUi(); articles size=10

2. 如你所见,'updateUi()'之后的所有内容都不需要了。

© www.soinside.com 2019 - 2024. All rights reserved.