Eventbus原理及源碼分析

Eventbus消息事件總線:

原理:發(fā)布者發(fā)布消息,通過Eventbus通知訂閱者接收消息

設(shè)計(jì)模式:觀察者模式,發(fā)布(被觀察者)--訂閱(觀察者);

知識(shí)點(diǎn):java反射,注解處理技術(shù)(annotationProcesser);

原理分析流程:用MainActivity作為例子

1.訂閱方法Subscriber;

當(dāng)在MainActivity訂閱方法的時(shí)候:

需要對(duì)方法進(jìn)行注解,設(shè)置threadMode

2.register注冊(cè);

在MainActivity中進(jìn)行注冊(cè)的時(shí)候

分析源碼:

在上面當(dāng)我們沒有使用Eventbus的注解處理器的時(shí)候,源碼會(huì)用反射去查找所有的訂閱方法:

FindSate類屬于查找訂閱方法的初始工具類,通過循環(huán)我們傳進(jìn)來的MainActivity類循環(huán)查找所有方法;

發(fā)現(xiàn)符合要求的方法Eventbus封裝成

這個(gè)方法發(fā)現(xiàn)是把所有的訂閱方法通過map存儲(chǔ),key是方法的參數(shù),值是所有訂閱方法(參數(shù)都是這個(gè)eventType);下面還有優(yōu)先級(jí)的判斷,來存儲(chǔ)在list里面的順序

這里會(huì)判斷是不是黏性事件。如果是黏性事件,會(huì)在注冊(cè)的時(shí)候直接發(fā)送訂閱;

3.post發(fā)送消息;

最終會(huì)走到這個(gè)方法

這個(gè)方法判斷ThreadMode

執(zhí)行method的invoke反射方法

4.接收消息;

當(dāng)我們執(zhí)行了上面invoke方法,相當(dāng)于是執(zhí)行了訂閱方法

5.反注冊(cè)。

比較重要的點(diǎn):

1.緩存策略,subscriptionByEventType,key為類type,值為類所有的訂閱方法

2.注解使用和沒用注解的區(qū)別

3.無論是否使用注解,到最后都要用到j(luò)ava反射機(jī)制。

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • EventBus 是我們?nèi)粘i_發(fā)中使用很頻繁的一個(gè)三方庫,原因很簡(jiǎn)單,使用 EventBus 可以很容實(shí)現(xiàn)解耦,不...
    Kip_Salens閱讀 429評(píng)論 0 1
  • 我每周會(huì)寫一篇源代碼分析的文章,以后也可能會(huì)有其他主題.如果你喜歡我寫的文章的話,歡迎關(guān)注我的新浪微博@達(dá)達(dá)達(dá)達(dá)s...
    SkyKai閱讀 25,175評(píng)論 23 184
  • EventBus源碼分析(二) 在之前的一篇文章EventBus源碼分析(一)分析了EventBus關(guān)于注冊(cè)注銷以...
    蕉下孤客閱讀 1,781評(píng)論 0 10
  • 最近在項(xiàng)目中使用了EventBus(3.0),覺得非常好用,于是就看了一些關(guān)于EventBus源碼分析的文章,現(xiàn)在...
    shenhuniurou閱讀 1,589評(píng)論 0 4
  • EventBus 是一款在 Android 開發(fā)中使用的發(fā)布/訂閱事件總線框架,基于觀察者模式,將事件的接收者和發(fā)...
    MonkeyLqj閱讀 10,559評(píng)論 3 31

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