如果以下列方式使用,新ViewModel
类的实例可以在配置更改后继续存在:
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时。
保存还原方案中是否会保留ViewModel
内的字段值?
编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous
答案 0 :(得分: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。
答案 1 :(得分:1)
It seems Google offers a solution for this now
UI状态通常存储或引用在ViewModel对象中,而不是 活动;所以使用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);
之后,您的ViewModel可以具有一个构造函数,该构造函数接收一个 SavedStateHandle:
public class SavedStateViewModel extends ViewModel {
private SavedStateHandle mState;
public SavedStateViewModel(SavedStateHandle savedStateHandle) {
mState = savedStateHandle;
}
...
}
SavedStateHandle类具有键值映射所需的方法:
- 获取(字符串键)
- 包含(字符串键)
- 删除(字符串键)
- 设置(字符串键,T值)
- keys()