Google EventBus 使用详解

EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。

首先使用 maven 依赖:

[java]  view plain  copy
  1. <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->  
  2.         <dependency>  
  3.             <groupId>com.google.guava</groupId>  
  4.             <artifactId>guava</artifactId>  
  5.             <version>19.0</version>  
  6.         </dependency>  

示例代码:

EventBusCenter.java

[java]  view plain  copy
  1. package com.lance.google.event.bus;  
  2.   
  3. import com.google.common.eventbus.EventBus;  
  4.   
  5. /** 
  6.  * Created by zhangzh on 2017/1/10. 
  7.  */  
  8. public class EventBusCenter {  
  9.   
  10.     private static EventBus eventBus = new EventBus();  
  11.   
  12.     private EventBusCenter() {  
  13.   
  14.     }  
  15.   
  16.     public static EventBus getInstance() {  
  17.         return eventBus;  
  18.     }  
  19.   
  20.     public static void register(Object obj) {  
  21.         eventBus.register(obj);  
  22.     }  
  23.   
  24.     public static void unregister(Object obj) {  
  25.         eventBus.unregister(obj);  
  26.     }  
  27.   
  28.     public static void post(Object obj) {  
  29.         eventBus.post(obj);  
  30.     }  
  31.   
  32.   
  33. }  

观察者一

[java]  view plain  copy
  1. package com.lance.google.event.bus;  
  2.   
  3. import com.google.common.eventbus.Subscribe;  
  4.   
  5. /** 
  6.  * Created by zhangzh on 2017/1/10. 
  7.  */  
  8. public class DataObserver1 {  
  9.   
  10.     /** 
  11.      * 只有通过@Subscribe注解的方法才会被注册进EventBus 
  12.      * 而且方法有且只能有1个参数 
  13.      * 
  14.      * @param msg 
  15.      */  
  16.     @Subscribe  
  17.     public void func(String msg) {  
  18.         System.out.println("String msg: " + msg);  
  19.     }  
  20.   
  21. }  

观察者二

[java]  view plain  copy
  1. package com.lance.google.event.bus;  
  2.   
  3. import com.google.common.eventbus.Subscribe;  
  4.   
  5. /** 
  6.  * Created by zhangzh on 2017/1/10. 
  7.  */  
  8. public class DataObserver2 {  
  9.     /** 
  10.      * post() 不支持自动装箱功能,只能使用Integer,不能使用int,否则handlersByType的Class会是int而不是Intege 
  11.      * 而传入的int msg参数在post(int msg)的时候会被包装成Integer,导致无法匹配到 
  12.      */  
  13.     @Subscribe  
  14.     public void func(Integer msg) {  
  15.         System.out.println("Integer msg: " + msg);  
  16.     }  
  17. }  

代码测试

Test.java

[java]  view plain  copy
  1. package com.lance.google.event.bus;  
  2.   
  3. /** 
  4.  * Created by zhangzh on 2017/1/10. 
  5.  */  
  6. public class Test {  
  7.   
  8.     public static void main(String[] args) throws InterruptedException {  
  9.   
  10.         DataObserver1 observer1 = new DataObserver1();  
  11.         DataObserver2 observer2 = new DataObserver2();  
  12.   
  13.         EventBusCenter.register(observer1);  
  14.         EventBusCenter.register(observer2);  
  15.   
  16.         System.out.println("============   start  ====================");  
  17.   
  18.         // 只有注册的参数类型为String的方法会被调用  
  19.         EventBusCenter.post("post string method");  
  20.         EventBusCenter.post(123);  
  21.   
  22.         System.out.println("============ after unregister ============");  
  23.         // 注销observer2  
  24.         EventBusCenter.unregister(observer2);  
  25.         EventBusCenter.post("post string method");  
  26.         EventBusCenter.post(123);  
  27.   
  28.         System.out.println("============    end           =============");  
  29.     }  
  30. }  

输出结果:

[java]  view plain  copy
  1. ============   start  ====================  
  2. String msg: post string method  
  3. Integer msg: 123  
  4. ============ after unregister ============  
  5. String msg: post string method  
  6. ============    end           =============  

看使用起来简单吧!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EventBus是一个开源的发布/订阅事件总线库,它简化了不同组件之间的通信,避免了紧密耦合的代码。它使用了观察者模式,让不同的组件能够在没有直接关联的情况下相互通信。下面是EventBus在Android中的使用详解。 1.导入EventBus库 在build.gradle文件中添加以下代码: ``` dependencies { implementation 'org.greenrobot:eventbus:3.2.0' } ``` 2.定义事件类 定义一个事件类,用于传递数据。 ```java public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } ``` 3.注册EventBus 在需要接收事件的组件中注册EventBus。 ```java @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } ``` 4.注销EventBus 在不需要接收事件的组件中注销EventBus。 ```java @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } ``` 5.发布事件 在发送事件的组件中发布事件。 ```java EventBus.getDefault().post(new MessageEvent("Hello EventBus!")); ``` 6.订阅事件 在接收事件的组件中订阅事件。 ```java @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { String message = event.message; // 处理事件 } ``` 7.指定线程模式 EventBus支持在不同的线程中处理事件,可以通过@Subscribe注解的threadMode参数指定线程模式。 ```java @Subscribe(threadMode = ThreadMode.MAIN) // 主线程 public void onMessageEvent(MessageEvent event) { String message = event.message; // 处理事件 } @Subscribe(threadMode = ThreadMode.BACKGROUND) // 后台线程 public void onMessageEvent(MessageEvent event) { String message = event.message; // 处理事件 } @Subscribe(threadMode = ThreadMode.ASYNC) // 异步线程 public void onMessageEvent(MessageEvent event) { String message = event.message; // 处理事件 } ``` EventBus使用非常简单,但是需要注意以下几点: - 订阅方法必须使用@Subscribe注解,并且方法必须是public、void类型。 - 发布事件和接收事件的参数类型必须一致。 - 在注册EventBus时,不要忘记在onStop()方法中注销EventBus,否则可能会引起内存泄漏。 - EventBus默认在主线程中处理事件,如果事件处理需要耗时操作,可以使用不同的线程模式。 - EventBus不支持跨进程通信,只能在同一进程中的组件之间进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值