java eventbus 原理_EventBus原理

EventBus实现了观察者模式,使用方法非常简单,可参考:有用的Guava(二)

这篇文章主要讲解EventBus的实现原理。

一言以蔽之:EventBus内部有一个map,当register时往map中增加一个元素(key为事件的类型,value为观察者),post时根据事件类型找到观察者之后,对其反射调用。

下面我们从register方法开始:

public void register(Object object) {

Multimap, EventHandler> methodsInListener =

finder.findAllHandlers(object);

handlersByTypeLock.writeLock().lock();

try {

handlersByType.putAll(methodsInListener);

} finally {

handlersByTypeLock.writeLock().unlock();

}

}

调用eventBus.register(new Event())时,会将事件类型及观察者(封装为EventHandler)放置在SetMultimap, EventHandler> handlersByType中,这是一个线程安全的对象容器,卸载事件也是在这个容器中做移除操作。根据事件类型查找观察者时使用了策略模式,HandlerFindingStrategy finder做为策略接口,目前只有一个策略实现AnnotatedHandlerFinder(查找带有Subscribe注解的方法)。

有了这样一个map,调用post时只需要根据类型找到观察者就行了:

public void post(Object event) {

Set> dispatchTypes = flattenHierarchy(event.getClass());

boolean dispatched = false;

for (Class> eventType : dispatchTypes) {

handlersByTypeLock.readLock().lock();

try {

Set wrappers = handlersByType.get(eventType);

if (!wrappers.isEmpty()) {

dispatched = true;

for (EventHandler wrapper : wrappers) {

enqueueEvent(event, wrapper);

}

}

} finally {

handlersByTypeLock.readLock().unlock();

}

}

if (!dispatched && !(event instanceof DeadEvent)) {

post(new DeadEvent(this, event));

}

dispatchQueuedEvents();

}

这里查找到参数匹配的EventHandler后并没有立刻执行反射调用,而是分发到了事件队列(ThreadLocal> eventsToDispatch)中,当所有事件分发完毕之后,事件队列做统一的事件消费。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值