MvvmCross Messenger插件清除订阅

时间:2013-10-29 09:36:47

标签: mvvmcross

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

我需要取消订阅吗?是不是弱引用的要点允许它被垃圾收集?

My BaseView在构造函数中订阅,如下所示。

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

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

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

我想在onDestroy中尝试取消订阅。

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

提前致谢。

1 个答案:

答案 0 :(得分:14)

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

private IDisposable _token;

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

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

如果你不这样做,那么GarbageCollector可以免费收集订阅。

有关这方面的更多信息,请参阅维基中{“3 {}}

中”订阅时从订阅中返回订阅令牌时,将发生此基于GC的取消订阅“部分。