Guava-EventBus详解

更新时间:2023-06-27 19:41:36 阅读: 评论:0

Guava-EventBus详解我的骄傲歌词
EventBus是⼀个事件(消息)发布订阅框架,使⽤了观察者模式,可以同步也可以异步。选择同步还是异步就根据个⼈场景来进⾏选择。
AsyncEventBus就是异步的,是在EventBus的基础上,加⼊了Executor来异步执⾏订阅者处理事件的⽅法,这样就不会因为订阅事件执⾏过慢⽽阻塞主线程,源码如下:
@Beta
public class AsyncEventBus extends EventBus {
public AsyncEventBus(String identifier, Executor executor) {
super(identifier, executor, Dispatcher.legacyAsync(), LoggingHandler.INSTANCE);
}
public AsyncEventBus(Executor executor, SubscriberExceptionHandler subscriberExceptionHandler) {
super("default", executor, Dispatcher.legacyAsync(), subscriberExceptionHandler);
}
public AsyncEventBus(Executor executor) {
长沙的大学有哪些super("default", executor, Dispatcher.legacyAsync(), LoggingHandler.INSTANCE);
}
}
先通过代码看⼀下它简单的⽤法:
事件处理器1:
public class EventApple {
声音的四字词语@Subscribe
public void eat(String apple){
卷怎么组词System.out.println("吃"+apple);
}
}
事件处理器2:
public class EventRun {
@Subscribe
public void run(Integer run){
System.out.println("跑步第"+run+"名");
}
}
注册事件处理器,发布事件。
public class TestEventBus {
public static void main (String[] args){
EventBus eventBus=new EventBus();
eventBus.post(5);
eventBus.post("苹果");
}
}
输出:
跑步第5名
吃苹果
才思敏捷的意思
EventBus的基本⽤法就是:
1、创建EventBus对象,EventBus的构造函数,源码如下:
public EventBus() {
this("default");
}
public EventBus(String identifier) {
this(identifier, MoreExecutors.directExecutor(), Dispatcher.perThreadDispatchQueue(), EventBus.LoggingHandler.INSTANCE);    }
public EventBus(SubscriberExceptionHandler exceptionHandler) {
this("default", MoreExecutors.directExecutor(), Dispatcher.perThreadDispatchQueue(), exceptionHandler);
}
EventBus(String identifier, Executor executor, Dispatcher dispatcher, SubscriberExceptionHandler exceptionHandler) {
this.subscribers = new SubscriberRegistry(this);
this.identifier = (String)Preconditions.checkNotNull(identifier);
this.dispatcher = (Dispatcher)Preconditions.checkNotNull(dispatcher);
}
构造函数有三个:
第⼀个是:创建⼀个新的EventBus对象,默认名称为default
第⼆个是:使⽤指定的标识符创建⼀个新的EventBus
第三个shi :使⽤SubscriberExceptionHandler ,处理subscribers处理事件时抛出异常。
2、注册事件处理器,源码:
void register(Object listener) {
Multimap<Class<?>, Subscriber> listenerMethods = this.findAllSubscribers(listener);
Collection eventMethodsInListener;
CopyOnWriteArraySet eventSubscribers;
for(Iterator var3 = listenerMethods.asMap().entrySet().iterator(); var3.hasNext(); eventSubscribers.addAll(eventMethodsInListener)) {
Entry<Class<?>, Collection<Subscriber>> entry = (();
Class<?> eventType = (Key();
健康人生绿色无毒征文eventMethodsInListener = (Value();
eventSubscribers = (CopyOnWriteArraySet)(eventType);
if (eventSubscribers == null) {
CopyOnWriteArraySet<Subscriber> newSet = new CopyOnWriteArraySet();
eventSubscribers = (CopyOnWriteArraySet)MoreObjects.firstNonNull(this.subscribers.putIfAbnt(eventType, newSet), newSet);
}
}
}
事件处理器中要被执⾏的事件,都需要使⽤ @Subscribe注解,表⽰是注册的事件。
3、发布事件
提高注意力的方法public void post(Object event) {
Iterator<Subscriber> eventSubscribers = Subscribers(event);
if (eventSubscribers.hasNext()) {
this.dispatcher.dispatch(event, eventSubscribers);
} el if (!(event instanceof DeadEvent)) {
this.post(new DeadEvent(this, event));
恍然大悟的反义词}
}
发布事件之后,就去注册的事件处理器中查找有@Subscribe的注解的⽅法,找到对应参数类型的事件就执⾏。
如果在注册的处理器中没有找到发布的事件,那么EventBus就会把该事件包装成个DeadEvent事件来重新发布,我们可以提供下⾯的事件处理来处理DeadEvent:
@Subscribe
public void onEvent(DeadEvent de) {
System.out.println("发布了错误的事件:" + de.getEvent());
}
AsyncEventBus是异步的,只需要在AsyncEventBus的构造函数中添加Executor即可:
AsyncEventBus asyncEventBus=new wFixedThreadPool(10));
其他操作和原始的EventBus是⼀样的。
EventBus中默认的订阅⽅式是线程不安全的,但是在异步调度的时候会⾃动将其包装成线程安全的。对于⼀般的线程安全的实现上可以通过@AllowConcurrentEvents注解来标⽰。

本文发布于:2023-06-27 19:41:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1053512.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事件   发布   处理器   订阅   注册   创建
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图