guava EventBus使用

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在使用ApplicationEvent和Listener快速实现业务解耦中提到了用Spring提供的观察者设计模式...
    jackcooper阅读 20,761评论 3 4
  • 本篇文章主要讲解关于EventBus的使用,下篇文章会根据EventBus的使用具体讲解其中的原理。虽然现在RxJ...
    Ruheng阅读 6,943评论 8 42
  • 先吐槽一下博客园的MarkDown编辑器,推出的时候还很高兴博客园支持MarkDown了,试用了下发现支持不完善就...
    Ten_Minutes阅读 580评论 0 2
  • 最近在项目中使用了EventBus(3.0),觉得非常好用,于是就看了一些关于EventBus源码分析的文章,现在...
    shenhuniurou阅读 1,525评论 0 4
  • 活久了,你就会知道:谁也不比谁聪明多少,谁也不比谁傻多少。无非是你愿意让自己聪明,还是愿意让自己傻,是揣着聪明装糊...
    雪中凝阅读 370评论 0 0