Android 有时不';调用initLoader后,无法获取onCreateLoader回调
我有一个活动,它在创建时调用initLoader,以便加载该活动将显示的数据。通常情况下,这很好。我设置了断点以查看所有事情发生的顺序。首先我调用initLoader,然后我得到OnCreateLoader回调,然后是OnLoadFinished回调,然后一切都很好 但是,我注意到,如果我在Android上更改了方向,我不会得到OnCreateLoader回调或OnLoadFinished回调,从而导致页面上没有显示任何数据。我仍然在initLoader调用上获得断点,因此我知道这正在发生,但我没有得到错误,也找不到任何文档来解释为什么调用initLoader后无法获得回调 有趣的是,如果我回到原来的方向,我确实会收到回调 因此,总结一下: 我以纵向定向开始活动Android 有时不';调用initLoader后,无法获取onCreateLoader回调,android,callback,orientation,loader,Android,Callback,Orientation,Loader,我有一个活动,它在创建时调用initLoader,以便加载该活动将显示的数据。通常情况下,这很好。我设置了断点以查看所有事情发生的顺序。首先我调用initLoader,然后我得到OnCreateLoader回调,然后是OnLoadFinished回调,然后一切都很好 但是,我注意到,如果我在Android上更改了方向,我不会得到OnCreateLoader回调或OnLoadFinished回调,从而导致页面上没有显示任何数据。我仍然在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)来重新加载数据我爱你!!我已经为这个问题苦思冥想了好几个小时了,你帮我省去了很多神经。