编辑: 这个问题有点过时了,因为谷歌已经给了我们范围 ViewModel
到导航图的能力。更好的方法(而不是试图清除活动范围模型)是为适当数量的屏幕和范围创建特定的导航图。
参考 android.arch.lifecycle.ViewModel
类。
ViewModel
的范围是它相关的 UI 组件的生命周期,因此在基于 Fragment
的应用程序中,这将是片段生命周期。这是一件好事。
在某些情况下,人们希望在多个片段之间共享一个 ViewModel
实例。具体来说,我对 许多屏幕与相同的基础数据相关 的情况很感兴趣。
(当多个相关片段显示在同一屏幕上时,文档建议使用类似的方法,但这 可以通过使用下面的答案使用单个主机片段来解决。)
这在 官方 ViewModel 文档 中进行了讨论:
ViewModel 还可以用作 Activity 的不同 Fragment 之间的通信层。每个 Fragment 都可以通过它们的 Activity 使用相同的键获取 ViewModel。这允许片段之间以解耦的方式进行通信,这样它们就不需要直接与另一个片段对话。
换句话说,要在代表不同屏幕的片段之间共享信息, ViewModel
的范围应该是 Activity
生命周期(根据 Android 文档,这也可以用于其他共享实例).
现在在新的 Jetpack Navigation 模式中,推荐使用“One Activity / Many Fragments”架构。这意味着该活动在应用程序被使用的整个过程中都存在。
即任何共享的 ViewModel
范围为 Activity
生命周期的实例将永远不会被清除 - 内存保持持续使用。
为了保留内存并在任何时间点尽可能少地使用,最好能够在不再需要时清除共享的 ViewModel
实例。
如何手动清除 ViewModel
从它的 ViewModelStore
或 holder 片段?
原文由 Richard Le Mesurier 发布,翻译遵循 CC BY-SA 4.0 许可协议
If you check the code here you’ll find out, that you can get the
ViewModelStore
from aViewModelStoreOwner
andFragment
,FragmentActivity
for示例实现,该接口。所以从那里你可以打电话
viewModelStore.clear()
,正如文档所说:注意: 这将清除特定 LifeCycleOwner 的所有可用 ViewModel,这不允许您清除一个特定的 ViewModel。