Eventbus: Les événements persistants sont reçus plusieurs fois

Créé le 25 nov. 2013  ·  3Commentaires  ·  Source: greenrobot/EventBus

Lorsque je travaillais avec des événements persistants, j'ai remarqué que je recevais des événements plusieurs fois. C'était le cas lorsque l'enregistrement et la publication d'événements se produisent en même temps. J'ai regardé rapidement dans le code. Dans la méthode postSticky, j'ai remarqué que le verrou sur l'objet stickyEvents est libéré immédiatement après la mise en place d'un événement persistant. Ensuite, l'événement est publié sur les auditeurs actuels.
Pour l'enregistrement, l'auditeur est d'abord enregistré pour recevoir des événements et essaie ensuite d'obtenir l'événement persistant. Lorsqu'il obtient l'événement persistant, il le reçoit. Cela signifie qu'un auditeur peut obtenir un événement deux fois :

  1. Le premier car l'auditeur est déjà enregistré et le postSticky poste l'événement aux auditeurs.
  2. Un deuxième car lors de l'enregistrement l'événement collant est déjà trouvé qui a été placé par le postSticky
need to investigate

Commentaire le plus utile

removeStickyEvent peut résoudre ce problème
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);

Tous les 3 commentaires

As-tu résolu ton problème?

J'ai utilisé une solution rapide. J'ai surchargé les méthodes registerSticky(Object), registerSticky(Object, int), postSticky(Object) sur la classe EventBus. Et je les ai synchronisés afin d'éviter la condition de course que j'ai décrite ci-dessus. Parce que c'était une solution rapide et qu'il y a peut-être une meilleure façon de le résoudre, je n'ai pas envoyé de correctif.

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 peut résoudre ce problème
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);

Cette page vous a été utile?
0 / 5 - 0 notes