相关疑难解决方法(0)

手动清除Android ViewModel?

参考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

36
推荐指数
5
解决办法
7780
查看次数

如何在一组特定的 Fragments 之间共享 ViewModel 范围,而不使用 NavGraph 或将其范围限定到活动?

谷歌表示,在 Fragment 之间进行通信时,通过将其范围限定为 Activity 来使用 SharedViewModel。

在单个 Activity 应用程序中,这意味着该 Activity 将散布着可能不再需要的 ViewModel,并且它们将在整个生命周期中保留在那里。考虑一些示例,例如扩展的注册流程或考虑几个屏幕的示例。

推荐的一种方法是使用父片段作为范围,但这只有在存在父片段时才可能。它可以只是不同的片段。

我想出了以下解决方案,我想知道它有多可行或有多糟糕,是否有更好的方法?

考虑到我有两个名为ExampleOneFragmentand的片段ExampleTwoFragment,为了简单起见,我希望它们具有共享范围,而不实际将其范围限定到活动。假设我想更新其中的文本视图ExampleOneFragmentExampleTwoFragment因此我为两者创建一个像这样的 SharedViewModel

因为ExampleOneFragment它将是:

 private val mSharedViewModel by lazy {
    ViewModelProvider(this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

因为ExampleTwoFragment我想出了这个:

private val mSharedViewModel by lazy {
    ViewModelProvider(supportFragmentManager().findFragmentByTag(ExampleOneFragment.TAG) ?: this).get(SharedViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我不知道这会导致什么样的问题。

我发现了一些其他解决方案:根据@mikhehc这里,我们实际上可以创建我们自己的 ViewModelStore。这将使我们能够精细地控制 ViewModel 必须存在的范围。但我不明白如何让它适用于片段?

其次,仍然是将其范围限定为活动的黑客方法,但使用我在此处找到的相同密钥通过虚拟视图模型将其清除

谁能指导我什么是正确的方法?我无法转向 NavGraphs,因为它是一个已经启动并正在运行的项目,并且确定活动范围感觉是错误的。谢谢。

android android-fragments android-navigation android-viewmodel android-architecture-navigation

5
推荐指数
1
解决办法
1180
查看次数