我开始尝试使用Android JetPack(ViewModel,体系结构组件,LIfeCycle等)。 直到现在,我一直在使用Model View Presenter体系结构,实际上我发现测试和维护体系结构非常容易。
另一方面,通过使用ViewModels可以看到的最大优势是它们与Activity和Fragments生命周期的本机耦合,这始终是Android开发人员最大的痛苦之一,因此我认为这是非常重要的一步向前。
尽管如此,但我认为还是存在很大的障碍:采用这种新方法,调用Activity或Fragment的方法似乎要困难得多,因为正如官方文档中所述
ViewModel绝不能引用视图,生命周期或任何 可能包含对活动上下文的引用。
在MVP方法中,Presenter与视图签订了合同,可以调用其所有方法。我对如何使用体系结构组件解决这种情况进行了一些研究,但是似乎没有简单而轻松的方法:最后,您总是必须处理ViewModel中的状态并对活动和片段中的这些更改做出反应。有人建议使用SingleLiveEvent类,这会使它更容易一些,但仍然比以前更加痛苦。
所以我的问题是:
文档说您不能引用任何持有对活动上下文的引用(为避免内存泄漏,我想是什么),但是如果我这样做然后又清除了ViewModel的onCleared()中的所有引用,该怎么办?
答案 0 :(得分:0)
您将避免内存泄漏,例如,如果旋转设备,您的activity
将被销毁,然后重新创建,但是VM
将保持不变,并且为{{1} }不会被调用(由于您的onCleared
仍引用了以前的活动,因此它仍保留在内存中)。
通常,MVVM从概念上说,VM
不应该了解ViewModels
,这就是架构的优点:没有更好的模式,只是一种更合适的,而您应该选择一种更适合您的。
答案 1 :(得分:0)
我可以想到几种方法来ViewModel
“通知用户”:
LiveData
对象和对此数据的Observer
Broadcast
来的accessing it statically,请使用应用程序的BroadcastReceiver
将Context
发送到ViewModel
编辑:我知道这并不是对问题的完全回答,但我认为它消除了对此的需要
答案 2 :(得分:0)
但是如果我这样做然后清除ViewModel的onCleared()中的所有引用该怎么办?
为时已晚。 onCleared()
仅在活动完成/删除了片段后才调用,在配置更改时不会调用。
但是您可能会使用某种形式的命令队列,仅在订户可用时(例如DispatchWorkSubject
中的RxJava2-Extensions)才发出事件。
只需确保在onStart
中进行订阅,然后在onStop
中处理一次性物品即可。