Android从ViewModel调用View Controller方法

时间:2018-12-10 08:13:53

标签: android-lifecycle android-architecture-components android-livedata android-jetpack android-viewmodel

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

另一方面,通过使用ViewModels可以看到的最大优势是它们与Activity和Fragments生命周期的本机耦合,这始终是Android开发人员最大的痛苦之一,因此我认为这是非常重要的一步向前。

尽管如此,但我认为还是存在很大的障碍:采用这种新方法,调用Activity或Fragment的方法似乎要困难得多,因为正如官方文档中所述

  

ViewModel绝不能引用视图,生命周期或任何   可能包含对活动上下文的引用。

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

所以我的问题是:

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

3 个答案:

答案 0 :(得分:0)

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

通常,MVVM从概念上说,VM不应该了解ViewModels,这就是架构的优点:没有更好的模式,只是一种更合适的,而您应该选择一种更适合您的。

答案 1 :(得分:0)

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

  1. 发生变化的LiveData对象和对此数据的Observer
  2. 如果您不介意从Broadcast来的accessing it statically,请使用应用程序的BroadcastReceiverContext发送到ViewModel

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

答案 2 :(得分:0)

  

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

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


但是您可能会使用某种形式的命令队列,仅在订户可用时(例如DispatchWorkSubject中的RxJava2-Extensions)才发出事件。

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