有时在调用initLoader后不要进行onCreateLoader回调

时间:2011-10-18 15:47:27

标签: android callback orientation loader

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

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

有趣的是,如果我回到原来的方向,我确实得到了回调。

所以,总结一下:

我以纵向开始活动

  • 我叫initLoader
  • 我获得了onCreateLoader和onLoadFinished回调

然后我改为风景

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

我改回肖像

  • 我叫initLoader
  • 我获得了onCreateLoader和onLoadFinished回调

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

有谁知道发生了什么事?

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

您需要在onCreate中调用initLoader

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

答案 2 :(得分:2)

我一直在追踪这个问题

初始创建(OnActivityCreated)

initLoader - > OnCreateLoader - > OnOnStartLoading - > OnLoadFinished

方向更改 - 再次调用OnActivityCreated

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

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

似乎正在发生的事情是编写initLoader代码以假设在方向更改期间片段未被销毁,这当然不是android的其余部分如何工作..

答案 3 :(得分:1)

在方向更改时,我在光标适配器上发生了类似的事情。在onCreateView中调用了initloader(也尝试过onStart和onResume),但onCreatLoader以及其他加载器回调方法从未被调用过。另外值得注意的是,在我的例子中,片段包含在视图寻呼机中。

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

在我的情况下,修复正在改变这个:

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

我把它改成了

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我花了几周时间来跟踪这个问题。将以前的片段内容放到我的新片段上已经很累了。 最后修好了。

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

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

当新加载程序未正确激活时,它可以正常工作。

答案 6 :(得分:0)

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

我发现它就足够了:

    Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID);

    if (loader == null) {
        getActivity().getLoaderManager().initLoader(LOADERID, null, this);
    } else {
        getActivity().getLoaderManager().restartLoader(LOADERID, null, this);
    }