参考android.arch.lifecycle.ViewModel课程.
ViewModel限定在与其相关的UI组件的生命周期中,因此在Fragment基于应用程序的应用程序中,这将是片段生命周期.这是一件好事.
在某些情况下,人们想要ViewModel在多个片段之间共享实例.具体而言,我对许多屏幕与相同基础数据相关的情况感兴趣.
(当多个相关片段显示在同一个屏幕上时,文档提出了相似的方法,但这可以通过使用单个宿主片段来解决,如下面的答案所示.)
这在官方ViewModel文档中讨论:
ViewModels还可以用作活动的不同片段之间的通信层.每个Fragment都可以通过其Activity使用相同的密钥获取ViewModel.这允许以解耦方式在片段之间进行通信,使得它们永远不需要直接与其他片段对话.
换句话说,要在表示不同屏幕的片段之间共享信息,ViewModel应将其范围限定为Activity生命周期(并且根据Android文档,这也可以在其他共享实例中使用).
现在,在新的Jetpack导航模式中,建议使用"One Activity/Many Fragments"架构.这意味着活动在应用程序使用的整个过程中都存在.
即任何ViewModel作用于Activity生命周期的共享实例永远不会被清除 - 内存仍然在不断使用.
为了保留内存并在任何时间点使用尽可能少的内容,能够ViewModel在不再需要时清除共享实例会很好.
如何ViewModel从它ViewModelStore或持有者片段手动清除?
android android-viewmodel android-architecture-components android-jetpack
视图模型与活动或与其相连的片段一起生存和死亡。这具有一定的影响,这超出了我的范围,为什么没有人问(如果我们将Navigation体系结构引入图片中)。
根据最新的android博客和导航框架的工作方式,建议我们使用Single Activity Multiple Fragments一节。
据说我有以下应用程序设计。
Activity A (Application Entry Point)
----------
Fragment (A) (Uses ViewModel AB)
Fragment (B) (Uses ViewModel AB)
Fragment (C) (Uses ViewModel CDE)
Fragment (D) (Uses ViewModel CDE)
Fragment (E) (Uses ViewModel CDE)
Run Code Online (Sandbox Code Playgroud)
现在,由于我使用共享的视图模型,这意味着我的视图模型将附加到活动中。但是,这似乎是泄漏的。就像我从A一直遍历到E,然后又从片段弹出到片段B一样,视图模型CDE应该被销毁,但是不会被破坏,因为它已连接到活动。
同样,我们将无法将视图模型连接到片段,因为我们将共享它们的数据。
只有我提出这个问题的事实使我相信,根据我的理解,我在这里是错误的。如果我能对情况有一个适当的了解,那会很高兴。