Android从ViewModel调用View Controller方法



我开始玩Android JetPack(ViewModel、Architecture Components、LIfeCycle等等(。到目前为止,我一直在使用模型视图演示器体系结构,实际上我发现它是一个非常容易测试和维护的体系结构。

另一方面,我可以通过使用ViewModels看到的最大优势是它们与Activities和Fragments生命周期的原生耦合,这一直是Android开发人员最大的痛苦之一,所以我认为这是向前迈出的一大步。

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

ViewModel决不能引用视图、生命周期或任何可以保存对活动上下文的引用。

MVP方法中,Presenter与视图有一个契约,可以调用它的所有方法。我对如何使用体系结构组件来解决这种情况进行了一些研究,但似乎没有简单而无痛的方法:最后,您必须在ViewModel中处理状态,并对Activities和Fragments中的这些更改做出反应。有人建议使用SingleLiveEvent类,这会使它变得更容易,但仍然比以前痛苦得多。

所以我的问题是:

文档说,你不能引用任何包含对活动上下文引用的内容(我想是为了避免内存泄漏(,但如果我这样做,然后清除ViewModel的onCleared((中的所有引用呢?

您无法避免内存泄漏,因为例如,如果您旋转设备,您的activity将被销毁,然后重新创建,但VM将保持不变,并且它的onCleared将不会被调用(因此,您的旧活动仍保留在内存中,因为VM仍引用它(。

一般来说,MVVM在概念上说,ViewModels不应该知道View,这就是架构的美妙之处:没有更好的模式,只有一个更适合的模式,你应该选择更适合你的模式。

我可以想出几种方法来"通知用户"ViewModel:

  1. 更改的LiveData对象和此数据的Observer
  2. 如果您不介意从ViewModel静态访问,请使用应用程序的ContextBroadcastReceiver发送Broadcast

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

但如果我这样做,然后清除ViewModel的onCleared((中的所有引用,该怎么办?

太晚了。onCleared()仅在"活动"已完成/"片段"已删除时调用,在配置更改时不调用。


但是,您可能只在订阅者可用时使用某种形式的命令队列来发出事件,例如RxJava2 Extensions中的DispatchWorkSubject

只需确保您在onStart中进行订阅,然后在onStop中处理您的一次性物品。

最新更新