2013-10-29 73 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