手动清除 Android ViewModel?

新手上路,请多包涵

编辑: 这个问题有点过时了,因为谷歌已经给了我们范围 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 许可协议

阅读 1k
2 个回答

If you check the code here you’ll find out, that you can get the ViewModelStore from a ViewModelStoreOwner and Fragment , FragmentActivity for示例实现,该接口。

所以从那里你可以打电话 viewModelStore.clear() ,正如文档所说:

  /**
 *  Clears internal storage and notifies ViewModels that they are no longer used.
 */
public final void clear() {
    for (ViewModel vm : mMap.values()) {
        vm.clear();
    }
    mMap.clear();
}

注意: 这将清除特定 LifeCycleOwner 的所有可用 ViewModel,这不允许您清除一个特定的 ViewModel。

原文由 Róbert Nagy 发布,翻译遵循 CC BY-SA 4.0 许可协议

无需使用 Navigation Component 库的快速解决方案:

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

这将在不合并 Navigation Component 库的情况下解决此问题。这也是简单的一行代码。它将清除那些 ViewModels 之间共享的那些 --- Fragments 通过 Activity

原文由 Sakiboy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题