首页 > 解决方案 > Android 从 ViewModel 调用 View Controller 方法

问题描述

我开始使用 Android JetPack(ViewModel、架构组件、LIfeCycle 等)。直到现在,我一直在使用 Model View Presenter 架构,实际上我发现它非常容易测试和维护架构。

另一方面,我可以看到改用 ViewModel 的最大优势是它们与活动和片段生命周期的原生耦合,这一直是 Android 开发人员最大的痛点之一,所以我认为这是向前迈出的一大步。

话虽如此,但我认为有一个很大的缺点:使用这种新方法,调用 Activity 或 Fragment 的方法似乎要棘手得多,因为正如官方文档中所述

ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。

在 MVP 方法中,Presenter 与视图有一个契约,并且可以调用它的所有方法。我对如何使用架构组件解决这种情况进行了一些研究,但似乎没有简单而轻松的方法可以做到这一点:最后,您总是必须处理 ViewModel 中的状态并对活动和片段中的这些更改做出反应。有人建议使用SingleLiveEvent类,这使它更容易一些,但仍然比以前更痛苦。

所以我的问题是:

文档说你不能引用任何持有对活动上下文的引用的东西(我猜是为了避免内存泄漏),但是如果我这样做然后我清除 ViewModel 的 onCleared() 中的所有引用怎么办?

标签: android-lifecycleandroid-architecture-componentsandroid-livedataandroid-jetpackandroid-viewmodel

解决方案


我可以想到几种“通知用户”的方法ViewModel

  1. 一个LiveData改变和一个对象的Observer数据
  2. 如果您不介意从Broadcast_BroadcastReceiverContextViewModel

编辑:我知道这不完全是问题的答案,但我认为它消除了对它的需要


推荐阅读