2013-10-29 4 views
5

私はMvvmCrossアプリケーションでMessenger Pluginを使用していて、サブスクリプションをパージすることがあることに気付きました(「1つまたは複数のリスナーは失敗しました。これは私のアプリケーションでエラーを引き起こしています。デフォルトでは、私はサブスクリプションに弱参照を使用していますが、私はメッセージの購読を中止しません。MvvmCross Messenger Pluginサブスクリプションをパージする

サブスクライブしないといけませんか?それがガベージコレクションされるように弱い参照のポイントではありませんか?

私の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

関連する問題