Bei der Arbeit mit Sticky Events ist mir aufgefallen, dass ich Events mehrfach erhalten habe. Dies war der Fall, wenn die Registrierung und die Veröffentlichung von Veranstaltungen gleichzeitig erfolgen. Ich habe kurz in den Code geschaut. Bei der Methode postSticky ist mir aufgefallen, dass die Sperre des stickyEvents-Objekts sofort nach dem Setzen eines Sticky-Ereignisses aufgehoben wird. Dann wird das Ereignis an die aktuellen Listener gesendet.
Für die Registrierung wird der Listener zuerst für den Empfang von Ereignissen registriert und versucht anschließend, das Sticky-Ereignis abzurufen. Wenn es das klebrige Ereignis erhält, wird es es empfangen. Dies bedeutet, dass ein Listener ein Ereignis zweimal abrufen kann:
Hast du dein Problem gelöst?
Ich habe ein Quickfix verwendet. Ich habe die Methoden registerSticky(Object), registerSticky(Object, int), postSticky(Object) auf der Klasse EventBus überladen. Und sie synchronisierten, damit ich die oben beschriebene Race-Condition vermeide. Da es eine schnelle Lösung war und es vielleicht eine bessere Lösung gibt, habe ich keinen Patch gesendet.
public class EventBusWithStickyFix extends EventBus {
<strong i="8">@Override</strong>
public synchronized void registerSticky(Object subscriber) {
super.registerSticky(subscriber);
}
<strong i="9">@Override</strong>
public synchronized void registerSticky(Object subscriber, int priority) {
super.registerSticky(subscriber, priority);
}
<strong i="10">@Override</strong>
public synchronized void postSticky(Object event) {
super.postSticky(event);
}
}
removeStickyEvent kann dieses Problem beheben
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);
Hilfreichster Kommentar
removeStickyEvent kann dieses Problem beheben
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);