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