我有一个简单的项目MvvmCross + Xamarin.Android 我正在使用标准的MvvmCross导航来显示下一个视图。
假设有两个相关ViewModel的活动:第一个,第二个。 情形:
1. start the - FirstViewModel is displayed
2. go to SecondViewModel
3. press the hardware back button
因此,我有两个ViewModel在后台工作(基于弱信使和强信使事件)。 如果我想停止它,我可以调用GC.Collect。
我在这里有两个选项可以正确收集我的视图模型,并且我有两个问题:
1. use messenger + weak references
2. use messenger + strong references
基于弱引用的事件对我来说并不真正有用,因为即使对于ACTIVE ViewModel(绑定到当前显示的View),我也可能丢失订阅。这将导致我的视图在没有收到基于订阅的事件时进入状态,并且我的ViewModel将不会在后台响应服务(如传入消息)
强引用基于方法的事件效果更好,但在这种情况下我:
1. have to control manually moment when to subscribe/unsubscribe to events
2. have to make sure that I always unsubscribing from events on View deactivation/destroy
3. it seems that I also have to implement 4 methods and call it from native code on view activated/deactivate, created/destroyed.
PS:可能最好在MvvmCross SDK中实现这些方法,只要我们从MvvmCross基类(MvxActivity,MvxViewController)继承所有视图,它就会自动连接。
PPS:我读过this post,我仍然认为它应该在SDK级别的某个地方实现
您可以在此处下载示例项目: xLeak Source Code
答案 0 :(得分:1)
基于弱引用的事件并不适合我,因为即使对于ACTIVE ViewModel(绑定到当前显示的View),我也可能丢失我的订阅。这将导致我的视图在没有收到基于订阅的事件时进入状态,并且我的ViewModel将不会在后台响应服务(如传入消息)
这是不正确的。
如果使用从Messenger到ViewModel的弱引用,那么ViewModel仍然会从其View强引用 - 所以当它仍然是活动视图时它不会被Garbage Collected。
ps:可能最好在MvvmCross SDK中实现这些方法,只要我们从MvvmCross类(MvxActivity,MvxViewController)继承所有视图,它就会自动连接。
如果您有建议,可以随时: