Guava事件总线:暂停事件发布

Guava事件总线:暂停事件发布,guava,Guava,有没有办法暂停EventBus从guava库发布的事件 我有一个发布事件的方法changeSomething()(例如SomethingChangedEvent)。现在,这个方法在循环中被另一个方法doStuff()调用。 问题是每次调用changeSomething()时都会发布SomethingChangedEvent,即使只有最后一次更改是重要的。由于事件的处理程序执行一些重计算,因此应用程序的性能会快速下降 上次执行changeSomething()后,我想告诉guava恢复事件处理 有

有没有办法暂停EventBus从guava库发布的事件

我有一个发布事件的方法
changeSomething()
(例如
SomethingChangedEvent
)。现在,这个方法在循环中被另一个方法
doStuff()
调用。 问题是每次调用
changeSomething()
时都会发布
SomethingChangedEvent
,即使只有最后一次更改是重要的。由于事件的处理程序执行一些重计算,因此应用程序的性能会快速下降

上次执行
changeSomething()
后,我想告诉guava恢复事件处理


有没有办法告诉番石榴忽略所有的
SomethingChangedEvent
s,除了最后一个?

我尝试了这个模式,它是从毒丸模式中使用子分类得到的:

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

番石榴怎么知道它是最后一个呢?您需要在事件中添加一个鉴别器,并在订户端手动筛选。@Pache我想做的事情类似于
eventBus.stopPosting(SomethingChangedEvent.class)
,然后就在最后一次调用
eventBus.resumePosting(SomethingChangedEvent.class)
之前。更改事件不是选项,因为它不在我的代码中。您可以创建一个扩展
SomethingChangedEvent
的事件,如
IgnoreSomethingChangedEvent
,并将其发布到事件总线。此事件将由同一发布者接收,该发布者可以根据IgnoreSomethingChangedEvent的
实例将内部状态设置为忽略。创建其他事件以重新激活它。这很复杂,但似乎是唯一的方法(经过测试并有效)。@Pache谢谢,我会尝试一下,看看效果如何。