使用 onSaveInstanceState() 和 ViewModel 保存 activity 的状态
Saving activity's state with onSaveInstanceState() and ViewModel
读完这篇文章后,我对 ViewModels 留下了一些疑问:
https://developer.android.com/topic/libraries/architecture/saving-states
这里说你应该结合使用 ViewModel
进行配置更改(如屏幕旋转),并使用 onSaveInstanceState()
来处理 activity 的所有其他情况销毁然后重新创建以保存 UI 状态。
我的问题是我们如何知道调用 onCreate(Bundle)
时恢复状态的方法——我应该使用 ViewModel 还是应该使用接收到的包作为参数?当配置改变时,onSaveInstanceState()
也会被调用,显然onCreate()
总是被调用。
如果我只从 ViewModel 恢复状态,它不会始终保留正确的数据(因为 activity 可能由于配置更改以外的其他原因而被破坏)。如果我只使用保存在 onSaveInstanceState()
中的捆绑包,那我为什么要使用 ViewModel
开头?
我认为将此来源视为一个链条是件好事。
您有 2 个数据源 - ViewModel,速度更快但寿命更短,保存的实例状态速度更慢但寿命更长。
规则很简单 - 尝试使用您的 ViewModel,如果未填充它,请使用来自 onSaveInstanceState() 的包。
当您在 onCreate() 中执行 val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
时,您可以检查是否获得了 viewModel 的新实例。然后,如果它是一个新实例(即它的数据字段为空),您可以从您的包中获取一些基本数据,例如内容 ID,并根据该 ID 从后端或数据库中获取数据,用它填充您的新 ViewModel 和然后从 ViewModel 填充您的 activity(如果您使用的是 LiveData,那将非常自然)。
下次调用 onCreate 时重复该过程,从 ViewModel 填充 activity 或使用 Bundle 中的数据填充 ViewModel,然后从 ViewModel 填充 activity。
更新:
实际上官方docs中描述了非常相似的方法。唯一的区别是你将 bundle 传递给 ViewModel,它决定是否需要获取数据,我没有具体说明这个机制。
读完这篇文章后,我对 ViewModels 留下了一些疑问:
https://developer.android.com/topic/libraries/architecture/saving-states
这里说你应该结合使用 ViewModel
进行配置更改(如屏幕旋转),并使用 onSaveInstanceState()
来处理 activity 的所有其他情况销毁然后重新创建以保存 UI 状态。
我的问题是我们如何知道调用 onCreate(Bundle)
时恢复状态的方法——我应该使用 ViewModel 还是应该使用接收到的包作为参数?当配置改变时,onSaveInstanceState()
也会被调用,显然onCreate()
总是被调用。
如果我只从 ViewModel 恢复状态,它不会始终保留正确的数据(因为 activity 可能由于配置更改以外的其他原因而被破坏)。如果我只使用保存在 onSaveInstanceState()
中的捆绑包,那我为什么要使用 ViewModel
开头?
我认为将此来源视为一个链条是件好事。 您有 2 个数据源 - ViewModel,速度更快但寿命更短,保存的实例状态速度更慢但寿命更长。
规则很简单 - 尝试使用您的 ViewModel,如果未填充它,请使用来自 onSaveInstanceState() 的包。
当您在 onCreate() 中执行 val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
时,您可以检查是否获得了 viewModel 的新实例。然后,如果它是一个新实例(即它的数据字段为空),您可以从您的包中获取一些基本数据,例如内容 ID,并根据该 ID 从后端或数据库中获取数据,用它填充您的新 ViewModel 和然后从 ViewModel 填充您的 activity(如果您使用的是 LiveData,那将非常自然)。
下次调用 onCreate 时重复该过程,从 ViewModel 填充 activity 或使用 Bundle 中的数据填充 ViewModel,然后从 ViewModel 填充 activity。
更新: 实际上官方docs中描述了非常相似的方法。唯一的区别是你将 bundle 传递给 ViewModel,它决定是否需要获取数据,我没有具体说明这个机制。