您的位置:首页 > 编程语言 > Go语言

Google EventBus 使用详解

2017-01-10 16:00 459 查看
EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。
首先使用 maven 依赖:
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
示例代码:
EventBusCenter.java
package com.lance.google.event.bus;

import com.google.common.eventbus.EventBus;

/**
* Created by zhangzh on 2017/1/10.
*/
public class EventBusCenter {

private static EventBus eventBus = new EventBus();

private EventBusCenter() {

}

public static EventBus getInstance() {
return eventBus;
}

public static void register(Object obj) {
eventBus.register(obj);
}

public static void unregister(Object obj) {
eventBus.unregister(obj);
}

public static void post(Object obj) {
eventBus.post(obj);
}

}


观察者一
package com.lance.google.event.bus;

import com.google.common.eventbus.Subscribe;

/**
* Created by zhangzh on 2017/1/10.
*/
public class DataObserver1 {

/**
* 只有通过@Subscribe注解的方法才会被注册进EventBus
* 而且方法有且只能有1个参数
*
* @param msg
*/
@Subscribe
public void func(String msg) {
System.out.println("String msg: " + msg);
}

}
观察者二package com.lance.google.event.bus;

import com.google.common.eventbus.Subscribe;

/**
* Created by zhangzh on 2017/1/10.
*/
public class DataObserver2 {
/**
* post() 不支持自动装箱功能,只能使用Integer,不能使用int,否则handlersByType的Class会是int而不是Intege
* 而传入的int msg参数在post(int msg)的时候会被包装成Integer,导致无法匹配到
*/
@Subscribe
public void func(Integer msg) {
System.out.println("Integer msg: " + msg);
}
}

代码测试Test.java
package com.lance.google.event.bus;

/**
* Created by zhangzh on 2017/1/10.
*/
public class Test {

public static void main(String[] args) throws InterruptedException {

DataObserver1 observer1 = new DataObserver1();
DataObserver2 observer2 = new DataObserver2();

EventBusCenter.register(observer1);
EventBusCenter.register(observer2);

System.out.println("============ start ====================");

// 只有注册的参数类型为String的方法会被调用
EventBusCenter.post("post string method");
EventBusCenter.post(123);

System.out.println("============ after unregister ============");
// 注销observer2
EventBusCenter.unregister(observer2);
EventBusCenter.post("post string method");
EventBusCenter.post(123);

System.out.println("============ end =============");
}
}

输出结果:
============ start ====================
String msg: post string method
Integer msg: 123
============ after unregister ============
String msg: post string method
============ end =============
看使用起来简单吧!

EventBus的使用注意问题:1.代码可读性很差,项目中使用的时候,从post的地方,查询handle使用,都是使用ide的搜索服务,问题很难定位,不如普通的接口调用方便查询;2.由于EventBus是将消息队列放入到内存中的,listener消费这个消息队列,故系统重启之后,保存或者堆积在队列中的消息丢失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息