摘要:實(shí)現(xiàn)了觀察者模式,使用方法非常簡(jiǎn)單,可參考有用的二這篇文章主要講解的實(shí)現(xiàn)原理。一言以蔽之內(nèi)部有一個(gè),當(dāng)時(shí)往中增加一個(gè)元素為事件的類型,為觀察者,時(shí)根據(jù)事件類型找到觀察者之后,對(duì)其反射調(diào)用。
EventBus實(shí)現(xiàn)了觀察者模式,使用方法非常簡(jiǎn)單,可參考:有用的Guava(二)
這篇文章主要講解EventBus的實(shí)現(xiàn)原理。
一言以蔽之:EventBus內(nèi)部有一個(gè)map,當(dāng)register時(shí)往map中增加一個(gè)元素(key為事件的類型,value為觀察者),post時(shí)根據(jù)事件類型找到觀察者之后,對(duì)其反射調(diào)用。
下面我們從register方法開始:
public void register(Object object) { Multimap, EventHandler> methodsInListener = finder.findAllHandlers(object); handlersByTypeLock.writeLock().lock(); try { handlersByType.putAll(methodsInListener); } finally { handlersByTypeLock.writeLock().unlock(); } }
調(diào)用eventBus.register(new Event())時(shí),會(huì)將事件類型及觀察者(封裝為EventHandler)放置在SetMultimap
有了這樣一個(gè)map,調(diào)用post時(shí)只需要根據(jù)類型找到觀察者就行了:
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(); }
這里查找到參數(shù)匹配的EventHandler后并沒有立刻執(zhí)行反射調(diào)用,而是分發(fā)到了事件隊(duì)列(ThreadLocal
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70464.html
摘要:最近在項(xiàng)目里接手別人的代碼來做完善,其中一個(gè)是修復(fù)獲取不到地址的,仔細(xì)看了下代碼,發(fā)現(xiàn)需要用到控件。所以,演變成文件的數(shù)據(jù)如何跟組件通信。 最近在項(xiàng)目里接手別人的代碼來做完善,其中一個(gè)是修復(fù)獲取不到MAC地址的bug,仔細(xì)看了下代碼,發(fā)現(xiàn)需要用到Activex控件。 上一位同事在寫的時(shí)候把寫在index.html文件中,獲取mac地址的js代碼也寫在了index.html中,讀取完之后...
閱讀 2907·2023-04-26 01:01
閱讀 3682·2021-11-23 09:51
閱讀 2514·2021-11-22 14:44
閱讀 3542·2021-09-23 11:57
閱讀 2826·2021-09-22 14:58
閱讀 5866·2021-09-10 11:25
閱讀 2100·2019-08-30 13:11
閱讀 1589·2019-08-30 12:59