2013-10-29 31 views
5

我在我的MvvmCross应用程序中使用Messenger插件,并且注意到它有时会清除我的订阅(“一个或多个侦听器失败 - 清除计划”)。这在我的应用程序中导致错误。默认情况下,我正在使用订阅的弱引用,并且我不退订邮件。MvvmCross Messenger插件清除订阅

我需要退订吗?是不是允许它被垃圾收集的弱点?

我的BaseView正在构造函数中订阅,如下所示。

public BaseView() 
    { 
     _messenger = Mvx.Resolve<IMvxMessenger>(); 
     _messenger.Subscribe<MyMessage>(s => Method()); 
    } 

以下是我的广播接收器发布我的消息。

var _messenger = Mvx.Resolve<IMvxMessenger>(); 
_messenger.Publish<MyMessage>(new MyMessage(this)); 

我有一个尝试在onDestroy取消订阅的想法。

如果你可以给我一些见解,为什么会发生这种情况,我将不胜感激。

在此先感谢。

+0

这个问题将受益于一些代码,而不是“我的BaseView正在构造函数中订阅,并且想要尝试在onDestroy中取消订阅。” – Stuart

+0

我已经添加了一些代码,如果您需要更多信息,请告诉我。 – Jake

回答

13

使用弱引用时,将返回的订阅令牌存储在类级字段中很重要。

private IDisposable _token; 

public BaseView() 
{ 
    _messenger = Mvx.Resolve<IMvxMessenger>(); 
    _token = _messenger.Subscribe<MyMessage>(OnMyMessage); 
} 

private void OnMyMessage(MyMessage msg) 
{ 
    // code 
} 

如果您不这样做,那么GarbageCollector可以自由收集订阅。

更多关于此,请参阅上一节“每当订阅令牌从订阅返回会发生这种基于GC-退订是垃圾回收”的维基 - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger