Android 有时不';调用initLoader后,无法获取onCreateLoader回调

Android 有时不';调用initLoader后,无法获取onCreateLoader回调,android,callback,orientation,loader,Android,Callback,Orientation,Loader,我有一个活动,它在创建时调用initLoader,以便加载该活动将显示的数据。通常情况下,这很好。我设置了断点以查看所有事情发生的顺序。首先我调用initLoader,然后我得到OnCreateLoader回调,然后是OnLoadFinished回调,然后一切都很好 但是,我注意到,如果我在Android上更改了方向,我不会得到OnCreateLoader回调或OnLoadFinished回调,从而导致页面上没有显示任何数据。我仍然在initLoader调用上获得断点,因此我知道这正在发生,但我

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

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

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

因此,总结一下:

我以纵向定向开始活动

  • 我叫initLoader
  • 我得到onCreateLoader和onLoadFinished回调
然后我转向风景

  • 我叫initLoader
  • 没有onCreateLoader或onLoadFinished回调
我改回肖像画

  • 我叫initLoader
  • 我得到onCreateLoader和onLoadFinished回调
类似地,如果我以横向模式启动活动,我会得到回调。那么,如果我换成肖像画,我就不会了。然后,如果我切换回横向,我会再次收到回调


有人知道发生了什么吗?

您需要在onCreate中调用initLoader


有关类似问题和更多信息,请查看

我一直在跟踪此问题

初始创建(OnActivityCreated)

initLoader->OnCreateLoader->onnstartLoading->OnLoadFinished

方向更改-再次调用OnActivityCreated

initLoader-OnLoadFinished(没有加载任何数据!)-错误

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


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

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


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

这是一个老问题,但可能有人仍然关心。。。
我也有同样的问题,并且能够解决它。这里有一个链接:

我在方向改变的片段中遇到了类似的情况。initloader在onCreateView中被调用(也尝试了onStart和onResume),但OnCreateLoader以及其他加载程序回调方法从未被调用。同样值得注意的是,在我的例子中,片段包含在一个视图寻呼机中

因此,最初创建了活动和视图寻呼机以及片段,一切正常。虽然我的片段中的列表无法获取数据,但方向发生了变化。再次改变方向,数据就回来了

在我的案例中,修复程序改变了这一点:

getActivity().getLoaderManager().initLoader( 0, null, this );
我改成了这个

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

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

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

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

当新加载程序未正确激活时,它会工作

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

我发现只要做到以下几点就足够了:

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

    if (loader == null) {
        getActivity().getLoaderManager().initLoader(LOADERID, null, this);
    } else {
        getActivity().getLoaderManager().restartLoader(LOADERID, null, this);
    }
Loader-Loader=getActivity().getLoaderManager().getLoader(LOADERID);
if(loader==null){
getActivity().getLoaderManager().initLoader(LOADERID,null,this);
}否则{
getActivity().getLoaderManager().restartLoader(LOADERID,null,this);
}

这就是它的工作原理。如果在已经加载数据的加载程序上调用init,它将通过onLoadFinished返回该数据。你应该看看,android.os.Bundle,android.app.LoaderManager.LoaderCallbacks)来重新加载数据我爱你!!我已经为这个问题苦思冥想了好几个小时了,你帮我省去了很多神经。