guava中EventBus(事件总线)源码分析与使用

Posted mask哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了guava中EventBus(事件总线)源码分析与使用相关的知识,希望对你有一定的参考价值。

1.EventBus:事件发布-订阅消息总线,简化应用程序内各组件间、进行模块间通信、解耦。允许对象通过观察者模式相互通信。

2.EventBus实现框架:

                  greenrobot的EventBus  

                  guava中EventBus

3.EventBus的工作模式

    

Publisher(发布者)通过post()方法,把Event事件发布出去,Subscriber(订阅者)在onEvent()方法中接收事件。

发布者:负责发出事件,然后将这些事件传递到事件总线,并发送给订阅该事件的所有侦听器。

侦听器侦听器订阅事件,并在生产者发布该事件时触发该事件,侦听器方法同步或异步运行,具体取决于使用的事件总线的类型。为了使同步运行的监听方法,可以使用一个同步事件总线是默认EventBus类,异步运行,使用AsyncEventBus类,这是一个EventBus子类,它的构造需要一个executor将被用于在单独的线程上执行该方法。默认使用EventBus。
事件 在Guava事件总线中,事件只是使用类名唯一标识的对象

4.eventbus通信的优点:

  • 简化了组件间交流的方式
  • 对事件通信双方进行解耦
  • 速度快,性能好

5.guava eventbus使用

p1.创建事件类型

package com.eventbus;

/**
 * 创建事件类型:HelloEvent
 */
public class HelloEvent {
    private int eventNo;

    private String eventName;

    public HelloEvent(int eventNo, String eventName) {
        this.eventNo = eventNo;
        this.eventName = eventName;
    }


    public int getEventNo() {
        return eventNo;
    }

    public void setEventNo(int eventNo) {
        this.eventNo = eventNo;
    }

    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }

    @Override
    public String toString() {
        return "HelloEvent{" +
                "eventNo=" + eventNo +
                ", eventName='" + eventName + '\\'' +
                '}';
    }
}

package com.eventbus;

/**
 * 创建新事件类型 WorldEvent
 */
public class WorldEvent {
    private int eventNo;

    private String eventName;

    public WorldEvent(int eventNo, String eventName) {
        this.eventNo = eventNo;
        this.eventName = eventName;
    }


    public int getEventNo() {
        return eventNo;
    }

    public void setEventNo(int eventNo) {
        this.eventNo = eventNo;
    }

    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }

    @Override
    public String toString() {
        return "HelloEvent{" +
                "eventNo=" + eventNo +
                ", eventName='" + eventName + '\\'' +
                '}';
    }
}

p2 创建监听器,接收事件消息

package com.eventbus;

import com.google.common.eventbus.Subscribe;

/**
 * 创建事件监听器:GuavaEventListener
 */
public class GuavaEventListener {

    @Subscribe
    public void subscribeHelloEvent(HelloEvent event){
        System.out.println("接收到 helloEvent,name:"+event.getEventName());
        System.out.println("处理 helloEvent,eventNo:"+event.getEventNo());

    }
    @Subscribe
    public void processObject(Object object) {
        System.out.println("process common event, class:" + object.getClass().getSimpleName());
    }
}

package com.eventbus;

import com.google.common.eventbus.Subscribe;

/**
 * 事件隔离:
 * 1.通过创建新的EventListener
 * 2.创建新的EventBus
 * 通过以上可以隔离事件
 *
 */
public class GuavaEventListener2 {

    @Subscribe
    public void subscribeHelloEvent2(WorldEvent event){
        System.out.println("接收到 WorldEvent,name:"+event.getEventName());
        System.out.println("处理 WorldEvent,eventNo:"+event.getEventNo());

    }
    @Subscribe
    public void processObject(Object object) {
        System.out.println("process common event, class:" + object.getClass().getSimpleName());
    }
}

p3.测试eventbus收发事件消息
package com.eventbus;

import com.google.common.eventbus.EventBus;

public class EventBusTest {
    public static void main(String[] args) {
        //1.创建事件总线
        EventBus eventBus=new EventBus();
        //2.创建监听器
        GuavaEventListener listener=new GuavaEventListener();
        //3.事件总线注册监听器
        eventBus.register(listener);
         //4.发送事件消息
        eventBus.post(new HelloEvent(12,"hello"));
        //5.发送完消息,必须取消监听器
        eventBus.unregister(listener);

        //创建新的EventBus隔离事件
        EventBus eventBus2=new EventBus();
        GuavaEventListener2 listener2=new GuavaEventListener2();
        eventBus2.register(listener2);
        eventBus2.post(new WorldEvent(222,"world"));
        eventBus2.unregister(listener2);
    }
}

6.Guava中消息总线EventBus源码分析

备注:Executor主要用于异步消息总线执行一个线程使用

EventBus 注册监听器源码分析:register()方法

EventBus发送事件消息源码分析:post()方法

异步消息总线(AsyncEventBus)

以上是关于guava中EventBus(事件总线)源码分析与使用的主要内容,如果未能解决你的问题,请参考以下文章

Google Guava EventBus(事件总线)

EventBus 3.0使用与源码分析

EventBus 3.0使用与源码分析

EventBus 3.0使用与源码分析

Guava源码学习EventBus

消息总线重构之EventBus