0
点赞
收藏
分享

微信扫一扫

Google Guava EventBus


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

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




    1. public class
    2.    
    3. public int lastMessage = 0;  
    4.    
    5. @Subscribe
    6. public void
    7.         lastMessage = event.getMessage();  
    8.     }  
    9.    
    10. public int
    11. return
    12.     }  
    13. }



    上面的lastMessage用来接收消息. 

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



    1. public class
    2.    
    3. private final int
    4.    
    5. public OurTestEvent(int
    6. this.message = message;  
    7.     }  
    8.    
    9. public int
    10. return
    11.     }  
    12. }



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



    1. @Test
    2. public void shouldReceiveEvent() throws
    3.    
    4. // given
    5. new EventBus("test");  
    6. new
    7.    
    8.     eventBus.register(listener);  
    9.    
    10. // when
    11. new OurTestEvent(200));  
    12.    
    13. // then
    14. 200);  
    15. }



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

    MultiListener的使用 

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




      1. public class
      2.    
      3. public
      4. public
      5.    
      6. @Subscribe
      7. public void
      8.         lastInteger = event;  
      9.     }  
      10.    
      11. @Subscribe
      12. public void
      13.         lastLong = event;  
      14.     }  
      15.    
      16. public
      17. return
      18.     }  
      19.    
      20. public
      21. return
      22.     }  
      23. }



      下面是对应的测试: 




      @Test
      public void shouldReceiveMultipleEvents() throws
         
      // given
      new EventBus("test");  
      new
         
          eventBus.register(multiListener);  
         
      // when
      new Integer(100));  
      new Long(800));  
         
      // then
      100);  
          assertThat(multiListener.getLastLong()).isEqualTo(800L);  
      }



      高级用法 

      1.Dead Event 

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



      1. /**
      2.  * Listener waiting for the event that any message was posted but not delivered to anyone
      3.  */
      4. public class
      5.    
      6. boolean notDelivered = false;  
      7.    
      8. @Subscribe
      9. public void
      10. true;  
      11.     }  
      12.    
      13. public boolean
      14. return
      15.     }  
      16. }


      下面是测试类: 



      1. @Test
      2. public void shouldDetectEventWithoutListeners() throws
      3.    
      4. // given
      5. new EventBus("test");  
      6.    
      7. new
      8.     eventBus.register(deadEventListener);  
      9.    
      10. // when
      11. 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消息 

      看下面的例子: 



      1. public class
      2.    
      3. private
      4.    
      5. @Subscribe
      6. public void
      7.         lastMessage = integer;  
      8.     }  
      9.    
      10. public
      11. return
      12.     }  
      13. }  
      14.   
      15.       
      16. public class
      17.    
      18. private
      19.    
      20. @Subscribe
      21. public void
      22.         lastMessage = integer;  
      23.     }  
      24.    
      25. public
      26. return
      27.     }  
      28. }


      对应的测试类: 



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


       

      举报

      相关推荐

      0 条评论