如果在AsyncTaskLoader运行期间发生方向更改,则不会调用LoaderCallbacks.onLoadFinished

Dad*_*boy 19 android

使用android-support-v4.jar和FragmentActivity(此时没有片段)

我有一个AsyncTaskLoader,我开始加载,然后在后台线程仍在运行时更改方向.在我的日志中,我看到响应来自后台请求.响应完成,我希望调用onLoadFinished(),但它永远不会.

作为一种故障排除方法,在Manifest中,如果我设置android:configChanges ="orientation"onLoadFinished()按预期调用.

我的Activity实现了加载器回调.在LoaderManager.initLoader()的源代码中,我看到如果加载器已经存在,则新的回调设置为LoaderInfo内部对象类,但我没有看到再次调用Loader.registerListener()的位置.只有在调用LoaderManagerImpl.createAndInstallLoader()时才会调用registerListener.

我怀疑,由于活动在方向更改时被销毁并重新创建,并且由于它是回调的监听器,因此未注册新活动以通知.

任何人都可以确认我的理解和解决方案,以便在方向改变后调用onLoadFinished?

Dad*_*boy 34

尼古拉发现了这个问题 - 谢谢.

我在onResume()上调用了initLoader.Android文档说明:

"你通常在活动的onCreate()方法中或在片段的onActivityCreated()方法中初始化一个Loader."

阅读"典型"比在处理配置更改生命周期时更加强调.

我将initLoader调用移动到onCreate(),这解决了我的问题.

我认为原因是在FragmentActivity.onCreate()中,从LastNonConfigurationInstance和FragmentActivity.onStart()中提取了LoaderManagers的集合,有一些关于Loaders和LoaderManagers的启动工作.在调用onResume()时,事情已经在进行中.当Loader第一次需要实例化时,从外部onCreate()调用initLoader仍然有效.

  • 感谢您在此总结,我将您的答案用于片段实现.它帮助了很多!另外,感谢Nikolay提供的信息.非常有帮助的人! (2认同)