Eventbus: Acara lengket diterima beberapa kali

Dibuat pada 25 Nov 2013  ·  3Komentar  ·  Sumber: greenrobot/EventBus

Saat bekerja dengan acara tempel, saya perhatikan bahwa saya menerima acara beberapa kali. Ini adalah kasus di mana pendaftaran dan posting acara terjadi pada saat yang bersamaan. Saya melihat sekilas kodenya. Dalam metode postSticky saya perhatikan bahwa kunci pada objek stickyEvents dilepaskan segera setelah menempatkan acara sticky. Kemudian acara tersebut diposting ke pendengar saat ini.
Untuk mendaftar, pendengar terlebih dahulu terdaftar untuk menerima acara dan setelah itu mencoba untuk mendapatkan acara yang lengket. Ketika mendapat acara lengket, itu akan menerimanya. Ini berarti pendengar bisa mendapatkan acara dua kali:

  1. Yang pertama karena pendengar sudah terdaftar dan postSticky memposting acara ke pendengar.
  2. Yang kedua karena saat mendaftar acara lengket sudah ditemukan yang ditempatkan oleh postSticky
need to investigate

Komentar yang paling membantu

removeStickyEvent dapat memperbaiki masalah ini
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);

Semua 3 komentar

Apakah Anda memecahkan masalah Anda?

Saya menggunakan perbaikan cepat. Saya membebani metode registerSticky(Object), registerSticky(Object, int), postSticky(Object) di kelas EventBus. Dan membuatnya sinkron sehingga saya menghindari kondisi balapan yang saya jelaskan di atas. Karena itu adalah perbaikan cepat dan mungkin ada cara yang lebih baik untuk menyelesaikannya, saya tidak mengirim tambalan.

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 dapat memperbaiki masalah ini
EventBus.getDefault().removeStickyEvent(NotifyToJoinEvent.class);

Apakah halaman ini membantu?
0 / 5 - 0 peringkat