我有一个在创建initLoader时调用initLoader的活动,以便加载活动将显示的数据。通常,这很好。我设置断点以查看一切发生的顺序。首先我调用initLoader,然后我得到OnCreateLoader回调,然后是OnLoadFinished回调,然后一切都很棒。
但是,我注意到如果我在Android上更改了方向,我没有获得OnCreateLoader回调或OnLoadFinished回调,导致页面上没有显示数据。我仍然在initLoader调用上得到断点,所以我知道这种情况正在发生,但我没有收到错误,我找不到任何文档解释为什么在调用initLoader后我不会得到回调。
有趣的是,如果我回到原来的方向,我确实得到了回调。
所以,总结一下:
我以纵向开始活动
然后我改为风景
我改回肖像
同样,如果我以横向模式启动活动,我会收到回调。然后,如果我切换到肖像,我不会。然后,如果我切换回横向,我会再次收到回调。
有谁知道发生了什么事?
答案 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);
}