gpt4 book ai didi

android - 手动清除 Android ViewModel?

转载 作者:IT老高 更新时间:2023-10-28 22:22:55 27 4
gpt4 key购买 nike

编辑: 这个问题有点过时了,因为 Google 已经让我们能够将 ViewModel 范围限定为导航图。更好的方法(而不是试图清除 Activity 范围的模型)是为适当数量的屏幕创建特定的导航图,并确定它们的范围。


引用android.arch.lifecycle.ViewModel类。

ViewModel 的范围是与其相关的 UI 组件的生命周期,因此在基于 Fragment 的应用程序中,这将是 fragment 生命周期。这是一件好事。


在某些情况下,希望在多个 fragment 之间共享一个 ViewModel 实例。具体来说,我对许多屏幕与相同的基础数据相关的情况感兴趣。

(当多个相关 fragment 显示在同一个屏幕上但 this can be worked around by using a single host fragment as per answer below 时,文档建议使用类似的方法。)

这在 official ViewModel documentation 中进行了讨论:

ViewModels can also be used as a communication layer between different Fragments of an Activity. Each Fragment can acquire the ViewModel using the same key via their Activity. This allows communication between Fragments in a de-coupled fashion such that they never need to talk to the other Fragment directly.

换句话说,为了在代表不同屏幕的 fragment 之间共享信息,ViewModel 应该限定在 Activity 生命周期(根据 Android 文档,这也可以是用于其他共享实例)。


现在在新的 Jetpack 导航模式中,建议使用“一个 Activity/许多 fragment ”架构。这意味着 Activity 在应用程序被使用的整个过程中都存在。

即范围为 Activity 生命周期的任何共享 ViewModel 实例永远不会被清除 - 内存保持在不断使用中。

为了在任何时候保留内存并尽可能少地使用,如果不再需要时能够清除共享的 ViewModel 实例,那就太好了。


如何从 ViewModelStore 或持有者 fragment 中手动清除 ViewModel

最佳答案

无需使用导航组件库的快速解决方案:

getActivity().getViewModelStore().clear();

这将在不合并 Navigation Component 库的情况下解决此问题。这也是简单的一行代码。它将通过 Activity

清除 Fragments 之间共享的那些 ViewModels

关于android - 手动清除 Android ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53653157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com