EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。
Observer模式是比较常用的设计模式之一,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模式就是这个模式。
Eventbus主要三个角色:
Event:事件。可以是任意类型的对象
Subscriber:事件订阅者,接收特定的事件。在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,具体来说,函数的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个,这个和ThreadMode(下面讲)有关。
Publisher:事件发布者,用于通知 Subscriber 有事件发生。可以在任意线程任意位置发送事件,直接调用eventBus.post(Object) 方法,可以自己实例化 EventBus对象。
EventBus基本用法:
在pom.xml中加入依赖:
<properties>
<guava.version>23.0</guava.version>
</properties>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>
使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可。代码如下:
消息处理类(观察者):
package com.clc.study.guava.eventbus;
import com.google.common.eventbus.Subscribe;
public class DataObserver1 {
/**
* 只有通过@Subscribe注解的方法才会被注册进EventBus
* 而且方法有且只能有1个参数,在接收到消息后,eventBus会用反射选择对应的处理函数。
*
* @param msg
*/
@Subscribe
public void handleEvent(String msg) {
System.out.println("Observer1: " + msg);
}
}
package com.clc.study.guava.eventbus;
import com.google.common.eventbus.Subscribe;
public class DataObserver2 {
@Subscribe
public void handleEvent(Integer num) {
System.out.println("Observer2: "+num);
}
}
封装EventBus
package com.clc.study.guava.eventbus;
import com.google.common.eventbus.EventBus;
public class EventBusManager {
private static EventBus eventBus = new EventBus();
public static EventBus getInstance(){
return eventBus;
}
public static void register(Object obj) {
eventBus.register(obj);
}
public static void post(Object obj) {
eventBus.post(obj);
}
public static void unregister(Object obj) {
eventBus.unregister(obj);
}
}
消息发布
package com.clc.study.guava.eventbus;
public class Main {
public static void main(String[] args) {
DataObserver1 observer1 = new DataObserver1();
DataObserver2 observer2 = new DataObserver2();
//注册观察者
EventBusManager.register(observer1);
EventBusManager.register(observer2);
//添加事件
EventBusManager.post("hello world!");
EventBusManager.post(12345);
EventBusManager.unregister(observer1);
EventBusManager.post("hello world2!");
EventBusManager.post(123456);
}
}
结果:
Observer1: hello world!
Observer2: 12345
Observer2: 123456