Eventbus: Sticky Events werden mehrfach empfangen

Erstellt am 25. Nov. 2013  ·  3Kommentare  ·  Quelle: greenrobot/EventBus

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:

  1. Der erste, weil der Listener bereits registriert ist und der postSticky das Ereignis an die Listener sendet.
  2. Ein zweites, weil bei der Registrierung bereits das Sticky-Ereignis gefunden wird, das vom postSticky platziert wurde
need to investigate

Hilfreichster Kommentar

removeStickyEvent kann dieses Problem beheben
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);

Alle 3 Kommentare

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);

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen