Google Guava EventBus

系统 1573 0

在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. }  

 

Google Guava EventBus


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论