我需要对后端JSON API进行网络调用,以便在用户更新其配置文件时对服务器端进行更改。
不幸的是,Android的固有生命周期事件可能会破坏这些异步任务。所以我选择AsyncTaskLoader
与getSupportLoaderManager
然而,我又遇到了另一个问题。尽管LoaderManager
中包含的加载器在方向更改中幸存下来 - 但它们无法在活动的破坏中存活(这很奇怪,因为Bundle savedInstanceState
会这样做)
// everything is good so far
LoaderManager.initLoader -> orientation change -> LoaderManager.getLoader(...) = <Some Loader>
outState.putString(...) -> orientation change -> savedInstanceState.getString(...) = <Some String>
// I am having problems now...
LoaderManager.initLoader -> activity destroyed by OS -> LoaderManager.getLoader(...) = null
outState.putString(...) -> activity destroyed by OS -> savedInstanceState.getString(...) = <Some String>
如何使LoaderManager
(更重要的是包含的加载器)与savedInstanceState
以下是一款小型Android应用,可说明当前的问题。请注意,只有在开发人员选项(启用了DONT KEEP ACTIVITIES)
时才会出现此问题答案 0 :(得分:1)
这是因为android框架在活动销毁期间持久化了一个包,但没有保留其他成员变量。
onSaveInstanceState会保留您放入其中的内容并将其存储在设备上,然后检索该捆绑包,以便在onCreate()中将其提供给您。
Loader类不会以这种方式运行。
如果活动被销毁,您将需要重新创建加载程序。
这是loadermanager的源代码 - 看起来我们可以启用调试日志来提供一些额外的见解: