架构组件ViewModel与savedInstanceState捆绑包

时间:2017-08-04 14:19:59

标签: android architecture viewmodel

尝试了解使用ViewModel保留活动或片段的某些状态,并使用savedInstanceState包保存它们之间的区别。

在配置更改的情况下,当os破坏活动/片段时,ViewModel实例保持活动状态,这样当os重新创建活动/片段时,可以从ViewModel实例获取仍然有效的数据。

是否适用于最小化应用并重新打开它?

进行了一些测试,似乎最小化应用程序并重新打开应用程序,操作系统将使用onCreate()中的stavedInstanceState包重新创建活动/片段,而不是null(调用onSaveInstanceStae()时保存的内容)。但ViewModel已被清除,因此创建了一个没有先前数据的新实例。

这是否意味着虽然在这种情况下os可以检索已保存的实例状态并传递给activity / fragment的onCreate(),但ViewModel必须是没有先前实例数据的新实例,或者viewModel需要执行一些额外的步骤,以便跨越实例存储/恢复数据?

3 个答案:

答案 0 :(得分:5)

可以找到一个很好的解释(以及问题的解决方案)in this blogpost。 TLDR:viewmodel托管在一个持久化片段中,该片段与托管活动一起重新创建。

答案 1 :(得分:2)

来自:克里斯汀·马西卡诺(Kristin Marsicano)的书“ Android编程:The Big Nerd Ranch Guide,第4版”。 :

ViewModel与已保存实例状态

已保存实例状态存储跨进程终止的活动记录,同时还存储跨配置更改的活动记录。首次启动活动时,已保存实例状态捆绑商品为空。旋转设备时,操作系统会在您的活动中调用 onSaveInstanceState(Bundle)。然后,操作系统会将您存储在捆绑软件中的数据传递到 onCreate(Bundle?)

ViewModel 当您使用它为活动编排动态数据时确实很闪耀

ViewModel 使在配置更改中继续下载操作变得简单。它还提供了一种简单的方法,可将配置更改期间昂贵的数据保存到内存中。而且,如您所见,一旦用户完成活动, ViewModel 便会自动清理。

ViewModel 在进程终止的情况下不会发光,因为它会与进程以及其中的所有内容一起从内存中消失。这是已保存实例状态的中心位置。但是保存的实例状态有其自身的局限性。由于已保存实例状态已序列化到磁盘,因此应避免存储任何大型或复杂对象。

lifecycle-viewmodel-savedstate 是一个新发布的库,用于允许 ViewModels 保存进程死亡期间的状态。这样可以减轻在活动中与已保存实例状态一起使用 ViewModels 的一些困难。

使用保存的实例状态存储重新创建UI状态所需的最少信息(例如,当前问题索引)。使用 ViewModel 可以缓存丰富的数据集,以跨配置更改将UI填充到内存中,以便快速,轻松地访问。

在流程终止后重新创建活动时,使用保存的实例状态信息来设置 ViewModel ,就像 ViewModel 和活动从未被破坏。

在撰写本文时,尚没有简单的方法来确定在流程终止与配置更改之后是否正在重新创建活动。为什么这么重要? ViewModel 在配置更改期间会保留在内存中。因此,如果在配置更改后使用已保存实例状态数据更新 ViewModel ,则意味着您的应用程序将执行不必要的工作。如果这项工作不必要地导致用户等待或使用其资源(例如电池),那么这种多余的工作就成问题了。

解决此问题的一种方法是使您的 ViewModel 更加智能。设置 ViewModel 值可能会导致更多工作时,请首先检查数据是否新鲜,然后再进行工作以获取并更新其余数据。

答案 2 :(得分:1)

如果有人仍想了解onSavedState与ViewModel之间的区别,请参见以下详细说明:

  1. onSavedInstanceState:onSavedInstance的主要用途不是处理方向更改,而是提供一种机制,以在Android系统破坏了应用程序/活动时检索数据。例如,当应用程序处于后台并且Android系统决定杀死它,因为它需要内存来执行其他一些高优先级进程时,在这种情况下,将在活动被销毁之前调用onSavedInstanceState。

  2. onSavedInstanceState仅存储Parcelable数据,该数据可在活动重新启动时为用户提供恢复状态的提示。它将数据保存在一个单独的进程的系统服务器中。

  3. onSavedInstanceState具有数据限制。只能保存少量的Parcelable数据。

在使用ViewModel时

  1. ViewModel对象是Applications进程内存的一部分,因此它能够保留配置更改。进程死亡后,ViewModel消失,所有保存的状态都将丢失。因此,当活动重启时,ViewModel中没有任何内容。

  2. 它用作重物的缓存。

  3. ViewModel中没有限制。

重要:始终记住 ViewModel和SavedState一起工作。它们不是彼此替代或替代。

enter image description here