使用onSaveInstanceState()和ViewModel保存活动的状态

时间:2019-02-23 10:32:55

标签: android android-activity persistence android-viewmodel android-mvvm

阅读此书后,我对ViewModels有一些疑问:

https://developer.android.com/topic/libraries/architecture/saving-states

在这里说,您应该结合使用ViewModelonSaveInstanceState()来进行配置更改(例如屏幕旋转),并同时将onCreate(Bundle)和其他所有销毁活动然后按顺序重新创建的情况一起使用保存UI状态。

我的问题是,当调用onSaveInstanceState()时,我们如何知道恢复状态的方式-我应该使用ViewModel还是应该使用收到的包作为参数?当配置更改时,也会调用onCreate(),并且显然总是调用onSaveInstanceState()

如果仅从ViewModel恢复状态,则状态将不会始终保留正确的数据(因为活动可能由于配置更改以外的其他原因而被破坏)。如果我只使用保存在ViewModel中的捆绑软件,那么为什么要使用{{1}}作为开头?

1 个答案:

答案 0 :(得分:2)

我认为最好将此来源视为一个链条。 您有2个数据源-ViewModel,速度更快,但寿命较短,保存的实例状态较慢,但寿命更长。

规则很简单-尝试使用ViewModel,如果未填充ViewModel,请使用onSaveInstanceState()中的捆绑软件。

在onCreate()中执行val model = ViewModelProviders.of(this).get(MyViewModel::class.java)时,可以检查是否获得了viewModel的新实例。然后,如果它是一个新实例(即数据字段为空),则可以从包中获取一些基本数据,例如内容ID,并根据该ID从后端或数据库中获取数据,并使用它填充新的ViewModel并然后从ViewModel填充您的活动(如果您使用的是LiveData,那将非常自然)。

下次调用onCreate时,您将重复该过程,要么从ViewModel填充活动,要么使用Bundle中的数据填充ViewModel,然后从ViewModel填充您的活动。

更新: 实际上,官方docs中描述了非常相似的方法。唯一的区别是,您将捆绑包传递给ViewModel,它决定是否需要获取数据,我对此机制并不具体。

相关问题