摘要:实现了观察者模式,使用方法非常简单,可参考有用的二这篇文章主要讲解的实现原理。一言以蔽之内部有一个,当时往中增加一个元素为事件的类型,为观察者,时根据事件类型找到观察者之后,对其反射调用。
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
有了这样一个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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70464.html
摘要:最近在项目里接手别人的代码来做完善,其中一个是修复获取不到地址的,仔细看了下代码,发现需要用到控件。所以,演变成文件的数据如何跟组件通信。 最近在项目里接手别人的代码来做完善,其中一个是修复获取不到MAC地址的bug,仔细看了下代码,发现需要用到Activex控件。 上一位同事在写的时候把写在index.html文件中,获取mac地址的js代码也写在了index.html中,读取完之后...
阅读 2863·2023-04-26 01:01
阅读 3655·2021-11-23 09:51
阅读 2496·2021-11-22 14:44
阅读 3459·2021-09-23 11:57
阅读 2778·2021-09-22 14:58
阅读 5833·2021-09-10 11:25
阅读 2080·2019-08-30 13:11
阅读 1574·2019-08-30 12:59