【问题标题】:Sometimes don't get onCreateLoader callback after calling initLoader有时调用 initLoader 后不会得到 onCreateLoader 回调
【发布时间】:2011-12-10 05:38:25
【问题描述】:

我有一个活动,它在创建时调用 initLoader 以加载活动将显示的数据。通常,这可以正常工作。我设置了断点来查看一切发生的顺序。首先我调用 initLoader,然后我得到 OnCreateLoader 回调,然后是 OnLoadFinished 回调,然后一切都很好。

但是,我注意到,如果我在我的 Android 上更改方向,我不会收到 OnCreateLoader 回调或 OnLoadFinished 回调,导致页面上没有显示任何数据。我仍然在 initLoader 调用上得到断点,所以我知道这正在发生,但我没有收到错误,也找不到任何文档解释为什么在调用 initLoader 后我不会得到回调。

有趣的是,如果我返回到原来的方向,我确实会收到回调。

所以,总结一下:

我以纵向开始活动

  • 我调用initLoader
  • 我得到 onCreateLoader 和 onLoadFinished 回调

然后我换成横向

  • 我调用initLoader
  • 没有 onCreateLoader 或 onLoadFinished 回调

我改回纵向

  • 我调用initLoader
  • 我得到 onCreateLoader 和 onLoadFinished 回调

同样,如果我以横向模式启动活动,我会收到回调。然后,如果我切换到肖像,我不会。然后,如果我切换回横向,我会再次收到回调。

有人知道发生了什么吗?

【问题讨论】:

    标签: android callback orientation loader


    【解决方案1】:

    我最近遇到了这个问题,想提交我的解决方案。

    我发现这样做就足够了:

        Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID);
    
        if (loader == null) {
            getActivity().getLoaderManager().initLoader(LOADERID, null, this);
        } else {
            getActivity().getLoaderManager().restartLoader(LOADERID, null, this);
        }
    

    【讨论】:

      【解决方案2】:

      我花了数周时间来跟踪这个问题。将以前的片段内容放到我的新片段中很累。 终于修好了。

      在实现 LoaderManager 的片段的 onCreate() 方法中,我这样做了

        getLoaderManager().initLoader(0, null, this);
              if(!getLoaderManager().getLoader(0).isReset()) {
                  getLoaderManager().restartLoader(0, null, this);
              }
      

      当新的加载器没有正确激活时它可以工作。

      【讨论】:

        【解决方案3】:

        在方向改变的片段中,光标适配器发生了一些非常相似的事情。在 onCreateView 中调用了 initloader(也尝试了 onStart 和 onResume),但从未调用过 onCreatLoader 以及其他加载器回调方法。同样值得注意的是,在我的情况下,该片段包含在视图寻呼机中。

        所以最初创建了活动和视图寻呼机和片段,并且一切正常。尽管我的片段中的列表不会获取数据,但在方向更改时。再次改变方向,数据又回来了。

        在我的情况下,修复改变了这一点:

        getActivity().getLoaderManager().initLoader( 0, null, this );
        

        我改成这个了

        getLoaderManager().initLoader( 0, null, this );
        

        【讨论】:

          【解决方案4】:

          这是一个老问题,但也许有人仍然关心...... 我有同样的问题并且能够解决它。这是链接:onCreateLoader not called when orientation changes

          【讨论】:

            【解决方案5】:

            我们在 ViewPager 中看到 Fragments 存在同样的问题。恢复片段时,加载程序似乎没有再次正确激活。事实上,当片段暂停时,我们的 CursorLoader 不再像我预期的那样获得 ContentObserver 回调。

            我们的解决方法是调用 restartLoader() 转储以前的内容并重新加载数据。这将具有与 destroyLoader(); 相同的净影响; initLoader(),但效率会更高。

            【讨论】:

            • 我爱你!我已经为这个问题苦恼了好几个小时了,你让我省了很多心。
            【解决方案6】:

            我一直在追踪这个问题

            初始创建(OnActivityCreated)

            initLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

            方向改变 - 再次调用 OnActivityCreated

            initLoader - OnLoadFinished(不加载任何数据!) - 错误。

            我发现的唯一解决方法是在 init 之前调用 destroyLoader()。这会强制执行正确的创建/开始/完成顺序。

            似乎正在发生的事情是 initLoader 代码被编写为假设片段在方向更改期间没有被破坏,这当然不是 android 其余部分的工作方式。.

            【讨论】:

            • 这就是它的工作方式。如果在已经加载数据的加载器上调用 init,它只会通过 onLoadFinished 返回该数据。你应该看看developer.android.com/reference/android/app/…, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks) 重新加载数据
            【解决方案7】:

            您需要在 onCreate 中调用 initLoader

            有关类似问题和更多信息,请查看LoaderCallbacks.onLoadFinished not called if orientation change happens during AsyncTaskLoader run

            【讨论】:

              猜你喜欢
              • 2012-05-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-10
              • 1970-01-01
              • 1970-01-01
              • 2021-06-16
              相关资源
              最近更新 更多