来自Kristin Marsicano的书籍“Android Programming: The Big Nerd Ranch Guide, 4th Edition.”:
ViewModel vs Saved Instance State
保存实例状态(Saved Instance State)不仅可以在进程死亡时存储活动记录,还可以在配置更改时存储活动记录。当你首次启动活动时,保存实例状态束为空。当你旋转设备时,操作系统会调用你的活动的onSaveInstanceState(Bundle)方法。然后,操作系统将你在束内存储的数据传递给onCreate(Bundle?)。
ViewModel在为活动编排动态数据时表现得非常出色。
ViewModel使得跨配置更改继续下载操作变得简单。它还提供了一种简单的方法来在配置更改期间保留昂贵的加载数据。而且,正如你所见,用户完成活动后,ViewModel会自动清理。
ViewModel在进程死亡情况下并不高效,因为它会与进程以及其中的所有内容一起从内存中删除。这就是保存实例状态成为主角的地方。但是保存实例状态也有其限制。由于保存实例状态被序列化到磁盘,所以应避免储存任何大型或复杂的对象。
lifecycle-viewmodel-savedstate是一个新库,刚刚发布,可以使ViewModels在进程死亡时保存它们的状态。这应该能够减轻使用ViewModels与saved instance state一起的困难。
使用saved instance state存储重新创建UI状态所需的最小信息(例如当前问题索引)。使用ViewModel在内存中缓存用于填充UI所需的丰富数据集,以便快速轻松地访问,跨配置更改。
当活动在进程死亡后重新创建时,使用保存实例状态信息设置ViewModel,就好像ViewModel和活动从未被销毁过一样。
截至撰写本文时,没有简单的方法确定活动是否正在进程死亡后重新创建还是进行配置更改。为什么这很重要?ViewModel在配置更改期间会保留在内存中。因此,如果你在配置更改后使用saved instance state数据来更新ViewModel,则会导致你的应用程序做出不必要的工作。如果这项工作导致用户等待或不必要地使用他们的资源(例如电池),则会造成问题。
解决此问题的一种方法是让ViewModel智能一些。当设置ViewModel值可能会导致更多工作时,请先检查数据是否新鲜,然后再执行拉取和更新其余数据的工作。