3

グアバ ライブラリから EventBus によるイベントの投稿を一時停止する方法はありますか。

changeSomething()イベントを投稿するメソッドがあります (例: SomethingChangedEvent)。現在、このメソッドはループ内で別のメソッドによって呼び出されていますdoStuff()。問題は、最後の変更のみが重要であるにもかかわらず、SomethingChangedEventへの呼び出しごとに が投稿されることです。changeSomething()イベントのハンドラーが重い計算を実行するため、アプリケーションのパフォーマンスが急速に低下します。

最後の時間changeSomething()が実行された後、グアバにイベント処理を再開するよう伝えたいと思います。

SomethingChangedEvent最後のものを除くすべての s を無視するようにグアバに指示する方法はありますか?

4

1 に答える 1

2

サブクラス化を使用してポイズンピルパターンから派生したこのパターンを試しました:

 public class SomethingChangedEvent {

        private final String name;

        public SomethingChangedEvent(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return name;
        }

    }

    public class IgnoreSomethingChangedEvent extends SomethingChangedEvent {
        public IgnoreSomethingChangedEvent(String name) {
            super(name);
        }

    }

    public class HandleSomethingChangedEvent extends SomethingChangedEvent {
        public HandleSomethingChangedEvent(String name) {
            super(name);
        }

    }

    private void eventBusTest() {
        EventBus eventBus = new EventBus();
        eventBus.register(new EventBusSomethingChanged());
        eventBus.post(new SomethingChangedEvent("process this one"));
        eventBus.post(new IgnoreSomethingChangedEvent("ignore"));
        eventBus.post(new SomethingChangedEvent("don't process this one"));
        eventBus.post(new HandleSomethingChangedEvent("handle"));
        eventBus.post(new SomethingChangedEvent("process this one bis"));
    }

    public class EventBusSomethingChanged {
        private boolean ignore;

        @Subscribe
        public void SomethingChanged(SomethingChangedEvent e) {
            if (e instanceof IgnoreSomethingChangedEvent) {
                ignore = true;
                return;
            }
            if (e instanceof HandleSomethingChangedEvent) {
                ignore = false;
                return;
            }
            if (!ignore) {
                System.out.println("processing:" + e);
            }
        }
    }
于 2012-11-08T12:15:11.607 に答える