资讯专栏INFORMATION COLUMN

EventBus原理

lsxiao / 1176人阅读

摘要:实现了观察者模式,使用方法非常简单,可参考有用的二这篇文章主要讲解的实现原理。一言以蔽之内部有一个,当时往中增加一个元素为事件的类型,为观察者,时根据事件类型找到观察者之后,对其反射调用。

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)中,当所有事件分发完毕之后,事件队列做统一的事件消费。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70464.html

相关文章

  • vue项目中,index.html数据与组件之间通信,传值,以获取MAC地址为例

    摘要:最近在项目里接手别人的代码来做完善,其中一个是修复获取不到地址的,仔细看了下代码,发现需要用到控件。所以,演变成文件的数据如何跟组件通信。 最近在项目里接手别人的代码来做完善,其中一个是修复获取不到MAC地址的bug,仔细看了下代码,发现需要用到Activex控件。 上一位同事在写的时候把写在index.html文件中,获取mac地址的js代码也写在了index.html中,读取完之后...

    zorpan 评论0 收藏0

发表评论

0条评论

lsxiao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<