eventbus 源碼分析

目前項(xiàng)目里用到了較多的eventbus來(lái)傳遞,接收收據(jù),所以今天就花了點(diǎn)時(shí)間整理了一下eventbus執(zhí)行流程

本文主要分析eventbus 里的幾個(gè)比較重要方法

1 ,eventbus.getdefault

獲取一個(gè)單例對(duì)象


2,eventbus.getdefault.register()

//獲取當(dāng)前注冊(cè)的類(lèi)

Class subscriberClass = subscriber.getClass();

獲取我們?cè)诋?dāng)前類(lèi)定義的接收eventbus方法列表

List subscriberMethods =subscriberMethodFinder.findSubscriberMethods(subscriberClass);

這個(gè)方法具體實(shí)現(xiàn)

首先 METHOD_CACHE是一個(gè) hashmap ,它里面緩存了我們已經(jīng)注冊(cè)過(guò)的的類(lèi)定義的接收方法列表,避免重復(fù)獲取

第一次進(jìn)來(lái)則會(huì)獲取我們定義的接收事件方法列表


這個(gè)方法首先是創(chuàng)建一個(gè)新的FindState類(lèi),通過(guò)兩種方法獲取,一種是從FIND_STATE_POOL即FindState池中取出可用的FindState,如果沒(méi)有的話,則通過(guò)第二種方式:直接new一個(gè)新的FindState對(duì)象。FindState類(lèi)是SubscriberMethodFinder的內(nèi)部類(lèi),這個(gè)方法主要做一個(gè)初始化的工作。這里由于初始化的時(shí)候,findState.subscriberInfo和subscriberInfoIndexes為空,所以這里會(huì)調(diào)用findUsingReflectionInSingleClass(findState);

方法,這個(gè)方法最終會(huì)獲取到我們定義接收消息類(lèi)的方法列表(主要代碼)


// This is faster than getMethods, especially when subscribers are fat classes like Activities?

,反射獲取們當(dāng)前注冊(cè)類(lèi)的自己聲明的方法列表

? ? methods = findState.clazz.getDeclaredMethods();

? //遍歷方法列表

? for (Method method : methods) {

? int modifiers = method.getModifiers();

? if ((modifiers & Modifier.PUBLIC) !=0 && (modifiers &MODIFIERS_IGNORE) ==0) {

? ? ? ? //獲取當(dāng)前方法的參數(shù)列表

????????Class[] parameterTypes = method.getParameterTypes();

? ? ? ? //這里判斷等于1 說(shuō)明我們定義的接收方法的參數(shù)只能有1個(gè)

????????if (parameterTypes.length ==1) {

? ? ? ? ? ? //獲取當(dāng)前方法是否有@subscribe 注解

????????????Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);

????????????if (subscribeAnnotation !=null) {

? ? ????????eventType = parameterTypes[0];

????????????if (findState.checkAdd(method, eventType)) {

????????????????ThreadMode threadMode = subscribeAnnotation.threadMode();

? ? ? ? ? ? ? ? //獲取方法的threadmode等屬性,并創(chuàng)建一個(gè)SubscriberMethod 添加ArrayList中

????????????????findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,

????????????????subscribeAnnotation.priority(), subscribeAnnotation.sticky()));

????????????}

????}

? ? ...

}

好了,我們定義的接收方法列表獲取到了,在看register接下來(lái)的邏輯

遍歷剛剛獲取的方法列表,調(diào)用subscribe方法,這是subscribe方法前半段

這段代碼主要是 以方法參數(shù)的類(lèi)型class為key,以list<subscription> 為value將其添加到subscriptionsByEventType這個(gè)hashmap中

下面的typesBySubscriber也是一個(gè)hashmap ,它是以當(dāng)前類(lèi)為key,以方法參數(shù)的類(lèi)型class為value,這個(gè)hashmap主要是判斷當(dāng)前event是否注冊(cè)


? ? ? ? 這個(gè)是subscribe方法后半部分,主要針對(duì)的是stickyevent,我們看到后面會(huì)調(diào)用checkPostStickyEventToSubscription(newSubscription, stickyEvent);這個(gè)方法,而這個(gè)方法最終會(huì)調(diào)用下面這個(gè)方法

這個(gè)方法就是去執(zhí)行subscription里的method

? ? ? ? ? ? 這里說(shuō)明我們?cè)诎l(fā)送stickyevent的時(shí)候,相應(yīng)的sticky方法會(huì)在當(dāng)前類(lèi)的eventbus注冊(cè)的時(shí)候調(diào)用

? ? ? ? ? ? ?到這里eventbus注冊(cè)就執(zhí)行完了

3 eventbus.getdefault.post() ? ? ? ? ? ? ? eventbus發(fā)送消息

? ? post方法會(huì)調(diào)用 ?postSingleEvent(eventQueue.remove(0), postingState); ? ? ? ?方法,然后再調(diào)用 postSingleEventForEventType(event, postingState, eventClass);方法,再看這個(gè)方法


? ? ? 首先這個(gè)subscriptionsByEventType(hashmap)是剛剛注冊(cè)的時(shí)候保存的方法列表,獲取到我們要發(fā)送的event之后會(huì)調(diào)用postToSubscription(subscription, event, postingState.isMainThread);方法,這個(gè)方法就是去執(zhí)行subscription里的method.

自此,eventbus基本執(zhí)行流程也就結(jié)束了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前面對(duì)EventBus 的簡(jiǎn)單實(shí)用寫(xiě)了一篇,相信大家都會(huì)使用,如果使用的還不熟,或者不夠6,可以花2分鐘瞄一眼:h...
    gogoingmonkey閱讀 356評(píng)論 0 0
  • EventBus源碼分析(二) 在之前的一篇文章EventBus源碼分析(一)分析了EventBus關(guān)于注冊(cè)注銷(xiāo)以...
    蕉下孤客閱讀 1,776評(píng)論 0 10
  • 簡(jiǎn)介 前面我學(xué)習(xí)了如何使用EventBus,還有了解了EventBus的特性,那么接下來(lái)我們一起來(lái)學(xué)習(xí)EventB...
    eirunye閱讀 508評(píng)論 0 0
  • EventBus源碼分析(一) EventBus官方介紹為一個(gè)為Android系統(tǒng)優(yōu)化的事件訂閱總線,它不僅可以很...
    蕉下孤客閱讀 4,096評(píng)論 4 42
  • EventBus是在Android中使用到的發(fā)布-訂閱事件總線框架,基于觀察者模式,將事件的發(fā)送者和接收者解耦,簡(jiǎn)...
    BrotherTree閱讀 460評(píng)論 0 1

友情鏈接更多精彩內(nèi)容