При работе с залипающими событиями я заметил, что получал события несколько раз. Это тот случай, когда регистрация и публикация событий происходят одновременно. Я быстро просмотрел код. В методе postSticky я заметил, что блокировка объекта stickyEvents снимается сразу после установки события sticky. Затем событие отправляется текущим слушателям.
Для регистрации слушатель сначала регистрируется для получения событий, а затем пытается получить закрепленное событие. Когда он получит событие залипания, он получит его. Это означает, что слушатель может получить событие дважды:
Вы решили свою проблему?
Я использовал quickfix. Я перегрузил методы registerSticky (Object), registerSticky (Object, int), postSticky (Object) в классе EventBus. И сделал их синхронизированными, чтобы избежать состояния гонки, описанного выше. Поскольку это было быстрое исправление и, возможно, есть лучший способ решения, я не отправлял патч.
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 может решить эту проблему
EventBus.getDefault (). RemoveStickyEvent (NotifyToJoinEvent.class);
Самый полезный комментарий
removeStickyEvent может решить эту проблему
EventBus.getDefault (). RemoveStickyEvent (NotifyToJoinEvent.class);