LoaderManager的加载器在方向更改中幸存,但不会破坏活动

问题描述 投票:0回答:1

我需要对后端JSON API进行网络调用,以便在用户更新其配置文件时进行服务器端更改。

不幸的是,Android的固有生命周期事件可能会破坏这些异步任务。所以我选择使用AsyncTaskLoadergetSupportLoaderManager

但是,我又遇到了另一个问题。虽然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)时才会出现此问题

https://anonfile.com/kfTft8d1b0/Android_async_loader_04.rar

  1. 首先单击应用程序中的INIT加载程序按钮
  2. 再次单击“概述”按钮
  3. 第三次重新进入应用程序
  4. 第四步单击应用程序中的GET加载程序按钮
  5. 观察返回值为NULL

enter image description here

android loader
1个回答
1
投票

这是因为android框架在活动销毁期间持久化了一个bundle,但没有保留其他成员变量。

onSaveInstanceState会保留您放入其中的内容并将其存储在设备上,然后检索该包以在onCreate()中将其提供给您(如果存在)。

Loader类不以这种方式运行。

如果活动被销毁,您将需要重新创建加载器。

这是loadermanager的源代码 - 看起来我们可以启用调试日志记录来提供一些额外的见解:

http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/app/LoaderManager.java#LoaderManager.enableDebugLogging%28boolean%29

© www.soinside.com 2019 - 2024. All rights reserved.