`
sunxboy
  • 浏览: 2826054 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Google Guava EventBus

 
阅读更多

在Google Guava 10版本引入了EventBus, 它主要用来简化我们处理生产/消费者编程模型. 

基本用法 
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可: 

Java代码  收藏代码
  1. public class EventListener {  
  2.    
  3.     public int lastMessage = 0;  
  4.    
  5.     @Subscribe  
  6.     public void listen(OurTestEvent event) {  
  7.         lastMessage = event.getMessage();  
  8.     }  
  9.    
  10.     public int getLastMessage() {  
  11.         return lastMessage;  
  12.     }  
  13. }  



上面的lastMessage用来接收消息. 

下面定义的类用来对消息进行封装: 

Java代码  收藏代码
  1. public class OurTestEvent {  
  2.    
  3.     private final int message;  
  4.    
  5.     public OurTestEvent(int message) {  
  6.         this.message = message;  
  7.     }  
  8.    
  9.     public int getMessage() {  
  10.         return message;  
  11.     }  
  12. }  



通过写一个测试来了解EventBus如何工作: 

Java代码  收藏代码
  1. @Test  
  2. public void shouldReceiveEvent() throws Exception {  
  3.    
  4.     // given  
  5.     EventBus eventBus = new EventBus("test");  
  6.     EventListener listener = new EventListener();  
  7.    
  8.     eventBus.register(listener);  
  9.    
  10.     // when  
  11.     eventBus.post(new OurTestEvent(200));  
  12.    
  13.     // then  
  14.     assertThat(listener.getLastMessage()).isEqualTo(200);  
  15. }  



上面的测试是不是很简单? 

MultiListener的使用 

只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅: 

Java代码  收藏代码
  1. public class MultipleListener {  
  2.    
  3.     public Integer lastInteger;  
  4.     public Long lastLong;  
  5.    
  6.     @Subscribe  
  7.     public void listenInteger(Integer event) {  
  8.         lastInteger = event;  
  9.     }  
  10.    
  11.     @Subscribe  
  12.     public void listenLong(Long event) {  
  13.         lastLong = event;  
  14.     }  
  15.    
  16.     public Integer getLastInteger() {  
  17.         return lastInteger;  
  18.     }  
  19.    
  20.     public Long getLastLong() {  
  21.         return lastLong;  
  22.     }  
  23. }  



下面是对应的测试: 

Java代码  收藏代码
  1. @Test  
  2. public void shouldReceiveMultipleEvents() throws Exception {  
  3.    
  4.     // given  
  5.     EventBus eventBus = new EventBus("test");  
  6.     MultipleListener multiListener = new MultipleListener();  
  7.    
  8.     eventBus.register(multiListener);  
  9.    
  10.     // when  
  11.     eventBus.post(new Integer(100));  
  12.     eventBus.post(new Long(800));  
  13.    
  14.     // then  
  15.     assertThat(multiListener.getLastInteger()).isEqualTo(100);  
  16.     assertThat(multiListener.getLastLong()).isEqualTo(800L);  
  17. }  



高级用法 

1.Dead Event 

如果EventBus发送的消息都不是订阅者关心的称之为Dead Event. 看下面的例子: 

Java代码  收藏代码
  1. /** 
  2.  * Listener waiting for the event that any message was posted but not delivered to anyone 
  3.  */  
  4. public class DeadEventListener {  
  5.    
  6.     boolean notDelivered = false;  
  7.    
  8.     @Subscribe  
  9.     public void listen(DeadEvent event) {  
  10.         notDelivered = true;  
  11.     }  
  12.    
  13.     public boolean isNotDelivered() {  
  14.         return notDelivered;  
  15.     }  
  16. }  



下面是测试类: 

Java代码  收藏代码
  1. @Test  
  2. public void shouldDetectEventWithoutListeners() throws Exception {  
  3.    
  4.     // given  
  5.     EventBus eventBus = new EventBus("test");  
  6.    
  7.     DeadEventListener deadEventListener = new DeadEventListener();  
  8.     eventBus.register(deadEventListener);  
  9.    
  10.     // when  
  11.     eventBus.post(new OurTestEvent(200));  
  12.    
  13.     assertThat(deadEventListener.isNotDelivered()).isTrue();  
  14. }  



如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息, 这时我们可以通过log的方式来记录这种状态. 

2.Event的继承 

如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息 

看下面的例子: 

Java代码  收藏代码
  1. public class NumberListener {  
  2.    
  3.     private Number lastMessage;  
  4.    
  5.     @Subscribe  
  6.     public void listen(Number integer) {  
  7.         lastMessage = integer;  
  8.     }  
  9.    
  10.     public Number getLastMessage() {  
  11.         return lastMessage;  
  12.     }  
  13. }  
  14.   
  15.       
  16. public class IntegerListener {  
  17.    
  18.     private Integer lastMessage;  
  19.    
  20.     @Subscribe  
  21.     public void listen(Integer integer) {  
  22.         lastMessage = integer;  
  23.     }  
  24.    
  25.     public Integer getLastMessage() {  
  26.         return lastMessage;  
  27.     }  
  28. }  



对应的测试类: 


Java代码  收藏代码
  1. @Test  
  2. public void shouldGetEventsFromSubclass() throws Exception {  
  3.    
  4.     // given  
  5.     EventBus eventBus = new EventBus("test");  
  6.     IntegerListener integerListener = new IntegerListener();  
  7.     NumberListener numberListener = new NumberListener();  
  8.     eventBus.register(integerListener);  
  9.     eventBus.register(numberListener);  
  10.    
  11.     // when  
  12.     eventBus.post(new Integer(100));  
  13.    
  14.     // then  
  15.     assertThat(integerListener.getLastMessage()).isEqualTo(100);  
  16.     assertThat(numberListener.getLastMessage()).isEqualTo(100);  
  17.    
  18.     //when  
  19.     eventBus.post(new Long(200L));  
  20.    
  21.     // then  
  22.     // this one should has the old value as it listens only for Integers  
  23.     assertThat(integerListener.getLastMessage()).isEqualTo(100);  
  24.     assertThat(numberListener.getLastMessage()).isEqualTo(200L);  
  25. }  

 

分享到:
评论

相关推荐

    Guava-Event-Bus:Guava的EventBus源码学习

    EventBus是google的一个Java工具包其中的一个工具类,类似的有多个版本其中包括移植到Android端的 和改良的,功能基本都是一样的。此处主要是对Guava版的EventBus分析,关于。 ###2. 功能简介 ####2.1 EventBus介绍 ...

    不加密Google Guava视频教程.txt

    ├─Google Guava 第19讲-Guava之EventBus和NIO2.0 WatchService综合实战.wmv ├─Google Guava 第20讲-实战:手动实现一个EventBus-01快速搭建程序结构.wmv ├─Google Guava 第21讲-实战:手动实现一个EventBus-...

    guava_programming.zip

    汪文君Google Guava 代码。Guava之函数式接口、Guava EventBus源码剖析以及优缺点总结

    Guava的Jar包(guava-26.0-jre.jar)

    Guava是Google公司开发的一款适用于Java的工具类集合。

    Java类库大全.docx

    Guava:由Google提供的Java类库,提供了许多用于优化和提高开发效率的工具和组件,如Guava Cache(提供了缓存功能)、Guava EventBus(提供了事件总线功能)、Guava Cache(提供了缓存功能)等。 Spring Framework:...

    AsmEventBus:AsmEventBus 是带有 asm 的事件系统的实现。 (废话...)

    它比 Google Guava的EventBus更快、更强大 {citation needed}。 什么是 ASM ASM是一个java库,提供实时的字节码修改和生成。 它的名字被称为内联汇编器, 虽然我认为是沙明丸绫的迷你裙…… AsmEventBus由ASM供电...

    Guava 16.0 API (CHM格式)

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...

    geeteventbus:用于高度并发的Python应用程序的进程内事件总线

    它受Java库(来自Google的Guava eventbus)的启发。 但这与Guava事件总线库并不完全相同。 geeteventbus简化了来自发布者和订阅者的事件处理。 发布者和订阅者不需要创建线程来同时处理事件。 eventbus可以是...

    Android EventBus 3.0.0 使用总结(必看篇)

    EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多。用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方便,但是...

    guava16.0 chm文档

     com.google.common.eventbus:发布订阅风格的事件总线。  com.google.common.hash: 哈希工具包。  com.google.common.io:I/O工具包。  com.google.common.math:原始算术类型和超大数的运算工具包。  ...

    java安卓仿微信聊天软件源码-ztd328423.github.io:个人博客

    java安卓仿微信聊天软件源码 # 应用架构 类库 应用架构 应用架构采用 官方介绍 ...EventBus Dragger2依赖注入 PullToRefresh下拉刷新 开源日志库Logger Okhttp网络请求 okhttp网络日志拦截器 --图片加载框

Global site tag (gtag.js) - Google Analytics