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