我在我的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中尝试取消订阅。
如果你能给我一些见解,为什么会发生这种情况以及可能的解决方案,我将不胜感激。
提前致谢。
答案 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的取消订阅“部分。