编辑: 这个问题现在有点过时了,因为 Google 已经给了我们将 ViewModel
范围扩展到导航图的能力。更好的方法(而不是试图清除活动范围的模型)是为适当数量的屏幕创建特定的导航图,以及这些屏幕的范围。
引用 android.arch.lifecycle.ViewModel
类。
ViewModel
的作用域是它所涉及的 UI 组件的生命周期,因此在基于 Fragment
的应用程序中,这将是片段生命周期。这是件好事。
在某些情况下,人们希望在多个片段之间共享一个 ViewModel
实例。具体来说,我感兴趣的情况下,许多屏幕与相同的底层数据相关。
(当多个相关的片段显示在同一个屏幕上,而不是 这可以通过使用单个主机片段来解决,如下面的答案所示上时,医生建议采用类似的方法。)
官方 ViewModel 文档讨论了这一点:
视图模型还可以用作不同 活动的片段。每个片段都可以获得 ViewModel 通过他们的活动使用相同的键。这允许通信 在碎片之间以解耦的方式,使他们永远不需要 直接和另一个碎片对话。
换句话说,为了在代表不同屏幕的片段之间共享信息,ViewModel
应该作用于 Activity
生命周期(根据 Android 文档,这也可以用于其他共享实例)。
现在,在新的 Jetpack 导航模式中,建议使用“一个活动/多个片段”体系结构。这意味着活动在应用程序被使用的整个时间都存在。
也就是说,任何作用域为 Activity
生命周期的共享 ViewModel
实例将永远不会被清除——内存仍在持续使用。
为了保存内存,并且在任何时候都尽可能少地使用需要的内存,如果能够在不再需要时清除共享的 ViewModel
实例就好了。
如何手动清除 ViewModel
从它的 ViewModelStore
或持有人片段?