2013-10-29 4 views
5

Ich benutze das Messenger Plugin in meiner MvvmCross Anwendung und habe festgestellt, dass es manchmal meine Abonnements bereinigt ("Ein oder mehrere Listener fehlgeschlagen - Bereinigung geplant"). Dies verursacht einen Fehler in meiner Anwendung. Standardmäßig verwende ich die schwache Referenz für die Abonnements und ich melde mich nicht von der Nachricht ab.MvvmCross Messenger Plugin Löschen von Abonnements

Muss ich mich abmelden? Ist nicht der Punkt einer schwachen Referenz, um es zu ermöglichen, Müll gesammelt zu werden?

Mein BaseView abonniert im Konstruktor wie unten gezeigt.

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

Unten ist mein Broadcast-Empfänger, der meine Nachricht veröffentlicht.

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

Ich habe eine Idee zu versuchen, in OnDestroy abzubestellen.

Wenn Sie mir einen Einblick geben könnten, warum dies passiert und eine mögliche Lösung wäre ich dankbar.

Vielen Dank im Voraus.

+0

Diese Frage von einigen Code profitieren würden statt "Mein BaseView abonniert im Konstruktor und hat die Idee, in onDestroy abzubestellen." – Stuart

+0

Ich habe einen Code hinzugefügt, lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. – Jake

Antwort

13

Wenn schwache Referenzen verwendet werden, ist es wichtig, das zurückgegebene Subskriptionstoken in einem Feld auf Klassenebene zu speichern.

private IDisposable _token; 

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

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

Wenn Sie dies nicht tun, ist der GarbageCollector frei, das Abonnement zu sammeln.

Weitere Informationen hierzu finden Sie im Abschnitt siehe „Das GC-basierte Abmelde wird auftreten, wenn das Abonnement-Token von Abonnieren zurückgegeben wird, ist Garbage Collection“ im Wiki - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger