我有一个简单的项目MvvmCross+Xamarin.Android,我使用标准的MvvmCross导航来显示下一个视图。
假设有两个与相关ViewModels相关的活动:第一,第二。设想情况:
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 (它绑定到当前显示的视图)。这将使我的视图在没有收到基于订阅的事件时进入状态,并且我的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中实现这些方法,只要我们从基类(MvxActivity、MvxViewController)继承所有视图,就可以自动连接这些方法。
PPS:我确实读过这个职位,我仍然认为应该在SDK级别实现它
您可以在这里下载示例项目:xLeak源代码
发布于 2014-11-19 09:40:39
基于弱引用的事件实际上并不适用于我,因为我可能会丢失订阅,即使是ACTIVE ViewModel (它绑定到当前显示的视图)。这将使我的视图在没有收到基于订阅的事件时进入状态,并且我的ViewModel将无法响应后台服务(如传入消息)。
这是错误的。
在使用从Messenger到ViewModel的弱引用的情况下,ViewModel仍然会从它的视图中被强烈引用-因此在它仍然是活动视图时,它不会被垃圾收集。
ps:可能最好在MvvmCross SDK中实现这些方法,只要我们从基类(MvxActivity、MvxViewController)继承所有视图,就可以自动连接这些方法。
如果你有建议,你可以:
https://stackoverflow.com/questions/27008035
复制相似问题