6

我在我的 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 的想法。

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

提前致谢。

4

1 回答 1

16

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

private IDisposable _token;

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

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

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

有关这方面的更多信息,请参阅 wiki - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins中的“只要从订阅返回的订阅令牌被垃圾收集,就会发生这种基于 GC 的取消订阅”部分#信使

于 2013-10-29T14:51:58.340 回答