21

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

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

有人对这个问题有任何见解吗?

4

5 回答 5

3

我有一个类似的问题,原因是我的代码中有initLoaderrestartLoader。根据用户的操作,我的查询可能会更改,因此我需要重新启动加载程序。

解决方案是仅使用restartLoader,即使在onResume回调方法中替换initLoaderrestartLoader

于 2015-05-28T05:55:36.740 回答
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 似乎根本没有这个问题。

于 2015-11-29T21:41:28.540 回答
2

我自己也遇到了同样的问题,没有好的解决方案。它似乎是 Android 框架中的错误,这里是类似的线程,其中建议的解决方案是将 initLoader() 放入 onResume() - 我已经尝试过它并且它有效,onLoadFinished() 只被调用一次: Android: LoaderCallbacks.OnLoadFinished called两次

于 2013-02-14T10:25:51.077 回答
2

请参阅我在Android 上的帖子:LoaderCallbacks.OnLoadFinished 调用了两次

在 ViewPager 中重新启动 Fragments 时,我遇到了类似的问题。我的解决方案是在完成加载程序后(在 onLoadFinished 结束时)通过调用

getLoaderManager().destroyLoader(LOADER_ID);

希望能帮助到你!

于 2014-03-04T21:22:01.563 回答
0

它看起来像框架加载器错误的实现/错误。 1.看看我从屏幕旋转后每个重要方法/回调的 Log.v(LOG_TAG, ...) 消息中得到了什么:

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

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

于 2020-05-10T15:42:17.520 回答