我们说我有两件事:
class Event1 {
}
class Event2 {
String returnValue;
}
@Subscribe
void listenTo(Event1 ev1) {
Event2 ev2=new Event2();
bus.post(ev2);
//ev2.returnValue here is null
}
@Subscribe
void listenTo(Event2 ev) {
ev2.returnValue="returnValue";
}
当我打电话
bus.post(new Event1());
处理程序
void listenTo(Event2 ev) { ... }
执行处理程序后执行
void listenTo(Event1 ev1) { ... }
结束了。这是因为eventBus处理队列中的事件。结果是我无法计算ev2.returnValue
- 它为空。如何以优雅的方式修改此代码,以便在bus.post(ev2);
我希望保持代码松散耦合时直接执行第二个处理程序。
答案 0 :(得分:0)
EventBus(或任何事件驱动的体系结构)可以在不改变现有部件的情况下解耦组件,扩展系统,例如。你要做的是将两个事件结合在一起,这是错误的,也是错误的。
事件应该是不可变的,以便您可以与不同的侦听器并行运行它们,并且始终获得相同的结果(否则,由于执行侦听器的顺序,您的结果可能会随着运行而变得随机)。
说出你可以做的所有事情:
使用AsyncEventBus进行处理:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/AsyncEventBus.html
有一个 AsyncEventBus ,它会调度ThreadPool Executor中的事件,因此您的 Event2 可能会与 Event1 并行运行(可能无法保证,因为线程可能很忙),你可以有一些等待逻辑来读 Event2 。
您可以直接调用 Event2 逻辑。
触发第3个事件事件3 ,当您想要与 Event1 侦听器进行通信时,以及使所有事件不可变。
我会选择第3种解决方案。