Cuando trabajaba con eventos pegajosos, noté que recibía eventos varias veces. Este fue el caso en el que el registro y la publicación de eventos ocurren al mismo tiempo. Eché un vistazo rápido al código. En el método postSticky noté que el bloqueo del objeto stickyEvents se libera inmediatamente después de poner un evento fijo. Luego, el evento se envía a los oyentes actuales.
Para registrarse, el oyente se registra primero para recibir eventos y luego intenta obtener el evento fijo. Cuando reciba el evento pegajoso, lo recibirá. Esto significa que un oyente puede obtener un evento dos veces:
¿Resolviste tu problema?
Usé una corrección rápida. Sobrecargué los métodos registerSticky (Object), registerSticky (Object, int), postSticky (Object) en la clase EventBus. Y los sincronicé para evitar la condición de carrera que describí anteriormente. Debido a que fue una solución rápida y tal vez haya una mejor manera de resolverlo, no envié un parche.
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 puede solucionar este problema
EventBus.getDefault (). RemoveStickyEvent (NotifyToJoinEvent.class);
Comentario más útil
removeStickyEvent puede solucionar este problema
EventBus.getDefault (). RemoveStickyEvent (NotifyToJoinEvent.class);