ViewModel是否能够在活动保存和恢复后生存?

Vas*_*liy 14 android viewmodel view-model-pattern android-viewmodel android-architecture-components

ViewModel如果以下列方式使用,新类的实例可以在配置更改后继续存在:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时.

ViewModel在保存还原方案中,是否会保留字段内的值?


编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

Zie*_*iem 14

根据ViewModelProvider文档(检查get方法),ViewModel当应用程序的进程被终止时不会保留:

创建的ViewModel与给定范围相关联,并且只要范围处于活动状态(例如,如果它是一个活动,直到它完成或进程被终止),它将被保留.

另外检查Ian Lake回答类似的问题:https: //medium.com/@ianhlake/you-are-correct-the-viewmodel-is-destroyed-if-your-process-is-killed-by-android-ef611fcd51e6

你是对的:如果你的进程被Android杀死,ViewModel就会被销毁.就像之前一样,您应该使用onSaveInstanceState()来存储您必须具有的任何数据,以便稍后以与以前相同的状态重新创建Activity.

我还建议阅读 Android ViewModel Architecture Component is Dangerous.


pum*_*nao 6

看来谷歌现在为此提供了解决方案

ViewModel 的已保存状态模块

UI State 通常在 ViewModel 对象中存储或引用,而不是在 Activity 中;因此,使用 onSaveInstanceState() 需要一些该模块可以为您处理的样板文件。

设置模块后,ViewModel 对象通过其构造函数接收 SavedStateHandle 对象。这是一个键值映射,可让您在保存的状态中写入和检索对象。这些值将在进程被系统终止后持续存在,并通过同一对象保持可用。


设置

implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02'(2019年11月7日)


用法

为了设置 ViewModel 来接收 SavedStateHandle,您需要使用扩展 AbstractSavedStateVMFactory 的工厂来创建它们。

SavedStateViewModel vm = new ViewModelProvider(this, new SavedStateVMFactory(this))
        .get(SavedStateViewModel.class);
Run Code Online (Sandbox Code Playgroud)

之后,您的 ViewModel 可以有一个接收 SavedStateHandle 的构造函数:


public class SavedStateViewModel extends ViewModel {
    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

存储和检索值

SavedStateHandle类具有您期望的键值映射方法:

  • 获取(字符串键)
  • 包含(字符串键)
  • 删除(字符串键)
  • 设置(字符串键,T值)
  • 键()

  • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下也是有用的:[在链接周围添加上下文](//meta.stackexchange.com/a/8259),这样您的其他用户就会知道它是什么,并且为什么它在那里,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。[仅是链接的答案可能会被删除。](//stackoverflow.com/help/deleted-answers) (2认同)