guava EventBus使用

2019-03-10  本文已影响0人  CarsonCao

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
上一篇下一篇

猜你喜欢

热点阅读