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(事件总线)源码分析与使用的主要内容,如果未能解决你的问题,请参考以下文章