【问题标题】:ViewModel gets cleared when "do not keep activity" dev option is turned on当“不保持活动”开发选项打开时,ViewModel 被清除
【发布时间】:2020-04-23 00:31:16
【问题描述】:

这是我的设置 1. Main Activity - 包含 MainFragment Mainfragment - 有 MainFragViewModel

复制 - 1.在开发者设置中开启不保留活动。 2. 启动应用程序。 3. 按主页。

现在由于我们的设置,当应用程序进入后台时发生了以下活动。 1. Fragment View 模型 - onCleared() [UNEXPECTED, 因为系统正在杀死片段,并且应用程序进程没有被杀死。] 2. 碎片被破坏【预期】 3. Main Activity 被销毁 - isFinishing = false (这意味着框架知道谁在杀死)[预期] 4. 应用程序没有被销毁[预期]

现在从后台应用卡片再次启动应用。并发生了以下情况。 1. 主要活动 - onCreate(bundle != null) [预期。它还提供捆绑!都好] 2. 已创建片段 [预期 - 包已交付。即不为空] 3. FragmentViewModel 实例被创建 [UnExpected!!因为视图模型应该幸存下来。因为我们没有弹出片段。由于dev设置被系统杀死]

这种行为破坏了我的设计,并且为了让我的应用程序在开发者手机上正常运行,他们可能会转而不要保持活动。我必须将信息保存在Bundle中!!

我错过了什么?您有哪些可能的解决方案?

【问题讨论】:

    标签: android mvvm viewmodel android-lifecycle


    【解决方案1】:

    这是故意的 - ViewModel 只保留在配置更改中。 “不保留活动”意味着活动不会经历配置更改 - 它们被完全销毁并且保留其保存的实例状态。您会注意到isFinishing() 不是正确的检查 - 正确的检查是 isChangingConfigurations(),当活动因“不保留活动”而被终止时,这确实是错误的。

    如果您的进程因内存不足而被终止,这与您遇到的行为类型相同,因此您必须确保您的 Fragment 在仅从保存的实例状态恢复时正常工作。

    【讨论】:

      【解决方案2】:

      我的第一个建议是改进您的问题。你的问题的意图相当模糊,我要建议的内容也很模糊。

      我的印象是您希望您的 viewModel 能够在 Activity's destruction/construction process 中存活下来。为此,您有两种选择:

      使用 ViewModelProviders

      使用 ViewModelFactory

      我建议测试您的设备并确保没有内存限制会强制调试模式清除 viewModel。只要应用程序存在或明确说明要清除 ViewModel,就不应清除 ViewModel。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多