EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。
1. EventBus基本用法
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可。
订户的工作:在事件处理方法上加上@Subscribe注解,方法名称随便,方法参数为监听的事件类型,这里是监听EventBus发出的TestEvent事件。如果需要监听多个事件,则需要实现多个方法,每个方法都加上@subscribe注解。
public class EventListener {
public int lastMessage = 0;
@Subscribe
public void listen(TestEvent event) {
lastMessage = event.getMessage();
System.out.println("Message:"+lastMessage);
}
public int getLastMessage() {
return lastMessage;
}
}
消息体:封装某种具体的事件
public class TestEvent {
private final int message;
public TestEvent(int message) {
this.message = message;
System.out.println("event message:"+message);
}
public int getMessage() {
return message;
}
}
另外,需要将订户注册到EventBus上,完成订阅工作。
public class TestEventBus {
@Test
public void testReceiveEvent() throws Exception {
EventBus eventBus = new EventBus("test");
EventListener listener = new EventListener();
eventBus.register(listener);
eventBus.post(new TestEvent(200));
eventBus.post(new TestEvent(300));
eventBus.post(new TestEvent(400));
System.out.println("LastMessage:"+listener.getLastMessage());
;
}
}
2. 特殊事件为Dead Event
如果EventBus发送的消息都不是订阅者关心的称之为Dead Event。订阅也可以响应处理该事件
public class DeadEventListener {
boolean notDelivered = false;
@Subscribe
public void listen(DeadEvent event) {
notDelivered = true;
}
public boolean isNotDelivered() {
return notDelivered;
}
}
3. Event的继承
如果订户监听Event A, 而Event A有一个子类Event B, 此时订户将同时接收Event A和B消息