LoaderManager 的加载器在方向改变后幸存,但未 activity 破坏
LoaderManager's loaders surviving orientation change, but not activity destruction
我需要对后端进行网络调用 JSON API 以便在用户更新其配置文件时在服务器端进行更改。
不幸的是,这些异步任务可能会被 Android 的固有生命周期事件中断。所以我选择使用 AsyncTaskLoader
和 getSupportLoaderManager
不过,我又运行陷入了另一个问题。尽管包含在 LoaderManager
中的加载器在方向改变后仍然存在 - 它们在 activity 的破坏中不存在(这很奇怪,因为 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 应用程序。请注意,此问题仅在开发人员选项(启用“不要保持活动”)时普遍存在
https://anonfile.com/kfTft8d1b0/Android_async_loader_04.rar
- 首先点击应用中的INIT loader按钮
- 第二次单击概览按钮
- 第三次重新进入app
- 第四次点击应用程序中的 GET loader 按钮
- 观察 return 值为 NULL
这是由于 android 框架在 activity 销毁期间保留了一个包,但没有保留其他成员变量。
onSaveInstanceState 保留您放入其中的内容并将其存储在设备上,然后检索该包以在 onCreate() 中将其提供给您(如果存在)。
加载程序 类 不会以这种方式运行。
如果 activity 被销毁,您将需要重新创建加载程序。
这是 loadermanager 的源代码 - 看起来我们可以启用调试日志记录以提供一些额外的见解:
我需要对后端进行网络调用 JSON API 以便在用户更新其配置文件时在服务器端进行更改。
不幸的是,这些异步任务可能会被 Android 的固有生命周期事件中断。所以我选择使用 AsyncTaskLoader
和 getSupportLoaderManager
不过,我又运行陷入了另一个问题。尽管包含在 LoaderManager
中的加载器在方向改变后仍然存在 - 它们在 activity 的破坏中不存在(这很奇怪,因为 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 应用程序。请注意,此问题仅在开发人员选项(启用“不要保持活动”)时普遍存在
https://anonfile.com/kfTft8d1b0/Android_async_loader_04.rar
- 首先点击应用中的INIT loader按钮
- 第二次单击概览按钮
- 第三次重新进入app
- 第四次点击应用程序中的 GET loader 按钮
- 观察 return 值为 NULL
这是由于 android 框架在 activity 销毁期间保留了一个包,但没有保留其他成员变量。
onSaveInstanceState 保留您放入其中的内容并将其存储在设备上,然后检索该包以在 onCreate() 中将其提供给您(如果存在)。
加载程序 类 不会以这种方式运行。
如果 activity 被销毁,您将需要重新创建加载程序。
这是 loadermanager 的源代码 - 看起来我们可以启用调试日志记录以提供一些额外的见解: