Eventbus: スティッキーイベントは複数回受信されます

作成日 2013年11月25日  ·  3コメント  ·  ソース: greenrobot/EventBus

スティッキーイベントを操作しているときに、イベントを複数回受信していることに気付きました。 これは、イベントの登録と投稿が同時に行われる場合でした。 コードをざっと見てみました。 postStickyメソッドで、stickyEventsオブジェクトのロックがstickyイベントを設定した直後に解放されることに気付きました。 次に、イベントが現在のリスナーに投稿されます。
登録の場合、リスナーは最初にイベントを受信するように登録され、その後、スティッキーイベントを取得しようとします。 スティッキーイベントを取得すると、受信します。 これは、リスナーがイベントを2回取得できることを意味します。

  1. 1つ目は、リスナーがすでに登録されており、postStickyがイベントをリスナーに投稿するためです。
  2. 2つ目は、登録中にpostStickyによって配置されたスティッキーイベントがすでに見つかっているためです。
need to investigate

最も参考になるコメント

removeStickyEventはこの問題を修正できます
EventBus.getDefault()。removeStickyEvent(NotifyToJoinEvent.class);

全てのコメント3件

問題を解決しましたか?

クイックフィックスを使用しました。 EventBusクラスのregisterSticky(Object)、registerSticky(Object、int)、postSticky(Object)メソッドをオーバーロードしました。 そして、それらを同期させたので、上記の競合状態を回避します。 それは迅速な修正であり、おそらくそれを解決するためのより良い方法があるので、私はパッチを送信しませんでした。

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);

このページは役に立ちましたか?
0 / 5 - 0 評価