美文网首页
guava EventBus使用

guava EventBus使用

作者: CarsonCao | 来源:发表于2019-03-10 23:14 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:guava EventBus使用

          本文链接:https://www.haomeiwen.com/subject/nurmpqtx.html