guava笔记12-EventBus 博客分类: guavajava相关
JDK从1.0开始就存在Observer和Observable,可以用来完成生产者/消费者这样的需求。其实也是观察者模式的实现。
Guava使用EventBus来实现类似的功能,但是用起来比Observer更方便。
直接拿代码来讲解吧。
//定义消息实体
class EventObj{
private String info;
public EventObj(String info){
this.info = info;
}
public String getInfo(){
return info;
}
}
//消息订阅者
class MySubcribler{
@Subscribe
public void recordInfo(EventObj eventObj){
System.out.println("first subscribe:"+eventObj.getInfo());
}
@Subscribe
public void recordInfo2(EventObj eventObj){
System.out.println("second subscribe:"+eventObj.getInfo());
}
@Subscribe
public void recordDeadEvent(DeadEvent deadEventObj){// 没有订阅者的消息一律为DeadEvent
System.out.println("dead event:"+deadEventObj.getEvent());
}
}
@Test
public void testEventBus(){
EventBus eventBus = new EventBus();
eventBus.register(new MySubcribler());//注册订阅者,可以注册多个
EventObj eo = new EventObj("event info");
eventBus.post(eo); //投递消息
eventBus.post("no subscriber"); //投递消息,该类型的消息没有订阅者
eventBus.post(9999); //投递消息,该类型的消息没有订阅者
}
运行上面的Test,结果如下:
second subscribe:event info
first subscribe:event info
dead event:no subscriber
dead event:9999
可以看到,EventBus用起来非常简单。
对于subscriber而言,只需要定义接到消息后如何处理即可,采用@Subscribe注解来表示。
对于publisher方而言,分为“注册订阅者”和“消息投递”两个步骤。
注册订阅者就是注册所有的subscriber。
消息投递就是发送一条消息,所有的subscriber会收到这条消息,但是只有参数类型跟消息类型一致的subscriber方法才会处理这条消息。
另外,有一种特殊的消息类型DeadEvent,任何没有subscriber接收的消息类型,都会被转换为DeadEvent。所有我们可以定义一个处理方法,接收DeadEvent类型的消息,一般可用于打印日志,或者排除问题。
消息监听具有继承的特性,如果订阅者A监听了TypeA类型的消息,那么他也会自动监听所有TypeA的子类型的消息。