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.
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值)
- 键()
| 归档时间: |
|
| 查看次数: |
5886 次 |
| 最近记录: |