EventBus源碼解析-Post過程

分析EventBus是如何發(fā)送事件的趾疚,入口就是EventBus的post方法內(nèi)


以上代碼可以拆解以下幾個(gè)步驟:

1:從TheadLocal修飾的對(duì)象內(nèi)取出1個(gè)PostingTheadState,該對(duì)象保存了當(dāng)前線程的狀態(tài)

2:從PostTheadState對(duì)象內(nèi)取出當(dāng)前事件的隊(duì)列立膛,并將要發(fā)送的事件添加到隊(duì)列內(nèi)

3:檢查狀態(tài),循環(huán)從隊(duì)列中取出事件進(jìn)行發(fā)送

4:復(fù)位PostTheadState狀態(tài)

流程進(jìn)入postSingleEvent方法內(nèi)讹堤,接著往下看


該流程也可拆分以下步驟:

1:查找跟要發(fā)送的事件相關(guān)的類以及接口吆鹤,存儲(chǔ)在緩存中

2:依次發(fā)送事件

3:如果無訂閱方法,發(fā)送1個(gè)默認(rèn)事件

方法主要還是進(jìn)入postSingleEventForEventType內(nèi)洲守;


繼續(xù)拆分:

1:通過要發(fā)送的事件查詢他的全部訂閱者信息

2:循環(huán)遍歷每個(gè)訂閱者疑务,執(zhí)行postToSubscription

3:修改PostingThreadState狀態(tài)信息

進(jìn)入postToSubscription


該方法是發(fā)送事件的重點(diǎn),前面的操作為事件的發(fā)送進(jìn)行鋪墊梗醇;

講到該方法知允,就得了解下TheadMode這個(gè)對(duì)象了,它是EventBus中的1個(gè)枚舉類叙谨,包含以下五種狀態(tài)

POSTING 默認(rèn)訂閱者和發(fā)布者同個(gè)線程

MAIN 主線程訂閱

MAIN_ORDERED 主線程訂閱

BACKGROUND, 后臺(tái)訂閱

ASYNC 異步訂閱

TheadMode的設(shè)置就決定了該訂閱方法在哪個(gè)線程被調(diào)度温鸽。

1:POSTING方式 ,直接調(diào)用invokeSubscriber反射調(diào)用觸發(fā)訂閱方法

2:MAIN方式手负,判斷發(fā)布者所在線程涤垫,如果是在主線程則直接調(diào)用invokeSubscriber反射調(diào)用觸發(fā)訂閱方法,否則通過mainThreadPoster調(diào)度來觸發(fā)

后面3,4,5原理邏輯 基本一致竟终,只是Poster不一樣蝠猬;

逐個(gè)分析下不同的Poster;


EventBus的成員變量就有3個(gè)不同的Poster, 并且在EventBus初始化的時(shí)候就初始化了


MainThreadPoster最終創(chuàng)建的是HandlerPoster


分發(fā)的時(shí)候執(zhí)行的是mainThreadPoster.enqueue,


在PendingPost中取出1個(gè)事件添加到隊(duì)列中衡楞,sendMessage觸發(fā)Handler的handlerMessage方法


handleMessage會(huì)開始1個(gè)死循環(huán)吱雏,不斷的從隊(duì)列中取出Post事件來執(zhí)行敦姻,取出事件后反射調(diào)用觸發(fā)訂閱方法瘾境;

循環(huán)退出的條件:1隊(duì)列中無post事件,2超過最大事件限制

BackgroundPoster實(shí)現(xiàn)的是Runnable接口 是一個(gè)線程類


enqueue也是從PendingPost中取出1個(gè)PendingPost放入隊(duì)列中镰惦,調(diào)用線程池開啟線程迷守,回調(diào)到run方法,接著看run方法


run方法內(nèi)也是1個(gè)死循環(huán)旺入,不斷的從隊(duì)列內(nèi)取出Post事件進(jìn)行處理兑凿,取出事件后調(diào)用invoke方法反射調(diào)用觸發(fā)訂閱方法;

AsyncPoster


AsyncPoster實(shí)現(xiàn)的也是Runnable接口茵瘾,但是run方法只取出1個(gè)進(jìn)行分發(fā)礼华,因?yàn)槊看味际怯嗛喌亩际窃?個(gè)新的線程,不會(huì)出現(xiàn)互相卡頓的現(xiàn)象拗秘;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圣絮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雕旨,更是在濱河造成了極大的恐慌扮匠,老刑警劉巖捧请,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棒搜,居然都是意外死亡疹蛉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門力麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來可款,“玉大人,你說我怎么就攤上這事克蚂≈耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵陨舱,是天一觀的道長(zhǎng)翠拣。 經(jīng)常有香客問我,道長(zhǎng)游盲,這世上最難降的妖魔是什么误墓? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮益缎,結(jié)果婚禮上谜慌,老公的妹妹穿的比我還像新娘。我一直安慰自己莺奔,他們只是感情好欣范,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著令哟,像睡著了一般恼琼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屏富,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天晴竞,我揣著相機(jī)與錄音,去河邊找鬼狠半。 笑死噩死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的神年。 我是一名探鬼主播已维,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼已日!你這毒婦竟也來了垛耳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎艾扮,沒想到半個(gè)月后既琴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泡嘴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年甫恩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酌予。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磺箕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抛虫,到底是詐尸還是另有隱情松靡,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響翅溺,放射性物質(zhì)發(fā)生泄漏妄均。R本人自食惡果不足惜碗脊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦笛洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湿诊,卻和暖如春狱杰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枫吧。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工浦旱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宇色,地道東北人九杂。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宣蠕,于是被迫代替她去往敵國(guó)和親例隆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容