场景1-如果我们使用ViewModels在片段之间进行通信,则ViewModel必须由 Activity 引用创建,因此将保留在内存中,直到 Activity 被销毁为止。

方案2-在主从流程中,ViewModel使我们的生活更轻松,但仍然存在内存使用问题。

方案3-在新版本的arch库中,我们具有viewModelScope来取消具有Fragment/Activity生命周期的作业,但是如果ViewModel是使用 Activity 引用创建的,则它将停留在该位置,直到 Activity 被销毁为止。因此,该作业仍然可以执行,并且片段已经消失了。

最佳答案

您可以使用ViewModels在两个不同的片段(也称为SharedViewmodels)之间进行通信,因为它很简单,但并不完美。

如您所知,SharedViewModels必须处于 Activity 状态,直到第一个联合父级( Activity 或片段)处于 Activity 状态。

可是等等 ...

ViewModels的目的是什么?

我们是否只为片段之间的通信创建ViewModels?绝对不。

使用ViewModels是否违背ViewModels的目的?不,我说将它们用于片段之间的通信不是完美的,但是如果您有一个小型项目,则可以使用它们,因为它很简单。

那么我该怎么办,而不是使用ViewModels在片段之间进行通信?您可以构建独立的UI组件,并将它们用于片段之间的通信。

构建这个怪异的独立UI组件有什么优势?这样,每个组件都有其自己的ViewModel(或Presenter),并且它们之间没有任何父/子关系。取而代之的是,它们从相同的业务逻辑进行更新,或者在响应式编程中,它们只是在观察相同的模型。

构建独立的UI组件是什么意思,以及如何构建它们?如果您已经熟悉响应式(Reactive)编程,建议阅读Hannes Dorfmann撰写的this很棒的博客文章。如果您不这样做,我只是建议使用EventBus库在片段之间进行通信,但是您很快就会意识到,过多使用该库会导致产生意大利面条式代码。

10-06 13:11