Guava EventBus体验

来源:互联网 发布:windows策略管理 编辑:程序博客网 时间:2024/06/05 10:51

EventBus初体验

1. 简介

EventBus是Guava提供的总线事件库,可实现进程内发布订阅功能;EventBus自动把事件分发给事件超类的监听者,并且允许监听者声明监听接口类型和泛型的通配符类型;
EventBus涉及到的角色有:- 消息生产者- 消息监听者- 角色管理平台

2 EventBus主要接口

接口 功能说明 register(Object object) 注册消息监听者 unregister(Object object) 移除消息监听者 post(Object object) 消息生产者发布消息

3. 代码demo

3.0 消息体

自定义一个消息类型Person,方便后续测试;

public class Person {    private String name;    private String address;    private String sex;    /**     * 省略getter/setter方法     */}

3.1 角色管理平台

角色管理平台核心就是一个EventBus对象,并封装EventBus的主要接口对外提供。

public class EventBusManager {    // 创建guava提供的EventBus对象    private static EventBus eventBus = new EventBus();    //————————单例模式————————    private EventBusManager() { }    private static final class InstanceHolder {        private static final EventBusManager INSTANCE = new EventBusManager();    }    public static EventBusManager getInstance() {        return InstanceHolder.INSTANCE;    }    /**     * 注册监听者     * @param o     */    public void register(Object o){        eventBus.register(o);    }    /**     * 移除监听者     * @param o     */    public void unregister(Object o) {        eventBus.unregister(o);    }    /**     * 消息发布接口     * @param o     */    public void post(Object o) {        eventBus.post(o);    }}

3.2 消息监听者

监听者需要通过@Subscribe来声明消息处理方式,支持泛型。

public class Subscriber<T> {    @Subscribe    public void out(T t){        if (t instanceof MsgDTO) {            MsgDTO dto = (MsgDTO) t;           System.out.println(dto.getName());            return;        }        System.out.println(t.toString());    }}

3.3 消息生产者

生产者发布消息之前需要先将消息监听者绑定到EventBus,然后才能保证消息被正确监听。

public class Main {    public static void main(String[] args) {        MsgDTO msgDTO = new MsgDTO();        msgDTO.setName("测试消息体");        // 先绑定消息监听者        EventBusManager.getInstance().register(new Subscriber());        EventBusManager.getInstance().post(msgDTO);        EventBusManager.getInstance().post(new Integer(12345645));        EventBusManager.getInstance().post("直接测试字符串");        EventBusManager.getInstance().post(1234);    }}

3.4 测试结果

测试消息体12345645直接测试字符串1234
原创粉丝点击