Android 開發(fā)之EventBus(2月4日 55%)

一牺陶、簡(jiǎn)介:

EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線途戒。

主要功能:替代Intent,Handler呜呐,BroadCast在Fragment,Activity悍募,Service蘑辑,線程之間傳遞消息。(避免了使用handler坠宴、AsynTask洋魂,接口回調(diào))

優(yōu)點(diǎn):開銷小,代碼更優(yōu)雅啄踊,將發(fā)送者和接收者進(jìn)行解耦忧设。獨(dú)立出一個(gè)發(fā)布訂閱模塊刁标,調(diào)用者可以通過使用這個(gè)模塊颠通,屏蔽一些線程切換問題,簡(jiǎn)單地實(shí)現(xiàn)發(fā)布訂閱功能膀懈。

缺點(diǎn):大量的濫用顿锰,將導(dǎo)致邏輯的分散,出現(xiàn)問題后很難定位启搂。

總得來說硼控,如果項(xiàng)目里面有大量的事件交互,那么還是可以通過EventBus來實(shí)現(xiàn)胳赌,否則還是推薦自己在模塊內(nèi)部實(shí)現(xiàn)觀察者模式

二牢撼、基本用法

EventBus框架中涉及四個(gè)成分:訂閱者,發(fā)布者疑苫,訂閱事件熏版,事件總線,他們的關(guān)系:


EventBus框架

EventBus用法也相當(dāng)簡(jiǎn)單:

(http://www.cnblogs.com/xijin-wu/p/5293212.html)

著重看一下響應(yīng)事件的四個(gè)函數(shù):

onEvent:?

該事件在哪個(gè)線程發(fā)出來的捍掺,onEvent就會(huì)在這個(gè)線程中運(yùn)行撼短,也就是說發(fā)布事件和接收事件線程在同一個(gè)線程(EventBus是如何做到的呢?)挺勿。使用這個(gè)方法時(shí)曲横,在onEvent方法中不能執(zhí)行耗時(shí)操作,如果執(zhí)行耗時(shí)操作容易導(dǎo)致事件分發(fā)延遲不瓶。

onEventMainThread:?

不論事件是在哪個(gè)線程中發(fā)布出來的禾嫉,onEventMainThread都會(huì)在UI線程中執(zhí)行灾杰。這個(gè)在Android中是非常有用的,因?yàn)樵贏ndroid中只能在UI線程中更新UI夭织,所以在onEvnetMainThread方法中是不能執(zhí)行耗時(shí)操作的吭露。

onEventBackground:

如果事件是在UI線程中發(fā)布出來的,那么onEventBackground就會(huì)在子線程中運(yùn)行尊惰,如果事件本來就是子線程中發(fā)布出來的讲竿,那么onEventBackground函數(shù)直接在該子線程中執(zhí)行。

onEventAsync:

無論事件在哪個(gè)線程發(fā)布弄屡,都會(huì)創(chuàng)建新的子線程在執(zhí)行onEventAsync.

發(fā)送時(shí)發(fā)送的是這個(gè)類的實(shí)例题禀,接收時(shí)參數(shù)就是這個(gè)類實(shí)例。

當(dāng)發(fā)過來一個(gè)消息的時(shí)候膀捷,EventBus怎么知道要調(diào)哪個(gè)函數(shù)呢迈嘹,就看哪個(gè)函數(shù)傳進(jìn)去的參數(shù)是這個(gè)類的實(shí)例,哪個(gè)是就調(diào)哪個(gè)全庸。那如果有兩個(gè)是呢秀仲,那兩個(gè)都會(huì)被調(diào)用!:I窠!

三覆劈、源碼解析

簡(jiǎn)單理解(猜測(cè))EventBus的實(shí)現(xiàn)原理:

當(dāng)我們使用EventBus.getDefault().register(this)將當(dāng)前類注冊(cè)到EventBus類時(shí)保礼,EventBus會(huì)掃描當(dāng)前類,把所有onEvent開頭的方法記錄下來责语。如何記錄呢炮障?使用Map,Key為方法的參數(shù)類型坤候,Value中包含我們的方法胁赢。即,以鍵值對(duì)的方式被存儲(chǔ)到EventBus中了白筹。其中key是自定義的事件(Event.class)智末,value是響應(yīng)該事件的所有類(舉例,A.class遍蟋,B.class)吹害。

當(dāng)發(fā)送一個(gè)Event后,EventBus會(huì)根據(jù)post中實(shí)參(即Event)的類型虚青,去Map中查找對(duì)應(yīng)的方法它呀,最終通過調(diào)用反射去執(zhí)行我們的方法。


訂閱者、發(fā)布者纵穿、EventBus 關(guān)系圖


EventBus 負(fù)責(zé)存儲(chǔ)訂閱者下隧、事件相關(guān)信息。訂閱者和發(fā)布者都只和 EventBus 關(guān)聯(lián)谓媒,他們不知道彼此的存在(這是EventBus的優(yōu)點(diǎn))淆院。



事件響應(yīng)流程

訂閱者首先調(diào)用 EventBus 的 register 接口訂閱某種類型的事件,當(dāng)發(fā)布者通過 post 接口發(fā)布該類型的事件時(shí)句惯,EventBus 執(zhí)行調(diào)用者的事件響應(yīng)函數(shù)土辩。






參考:

Android 源碼解析系列:

http://a.codekk.com/

EventBus源碼地址:

https://github.com/greenrobot/EventBus

EventBus源碼解析:

http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

張鴻洋 EventBus源碼解析:

http://blog.csdn.net/lmj623565791/article/details/40794879

http://blog.csdn.net/lmj623565791/article/details/40920453


跨進(jìn)程事件分發(fā)解決方案:

HermesEventBus-餓了么開源的Android跨進(jìn)程事件分發(fā)框架:

http://lrd.ele.me/2016/07/13/HermesEventBus-%E4%B8%80%E7%A7%8D%E6%96%B0%E7%9A%84Android%E8%B7%A8%E8%BF%9B%E7%A8%8B%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%A1%86%E6%9E%B6/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抢野,隨后出現(xiàn)的幾起案子拷淘,更是在濱河造成了極大的恐慌,老刑警劉巖指孤,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启涯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恃轩,警方通過查閱死者的電腦和手機(jī)结洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叉跛,“玉大人松忍,你說我怎么就攤上這事∶粱ィ” “怎么了挽铁?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵伟桅,是天一觀的道長(zhǎng)敞掘。 經(jīng)常有香客問我,道長(zhǎng)楣铁,這世上最難降的妖魔是什么玖雁? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮盖腕,結(jié)果婚禮上赫冬,老公的妹妹穿的比我還像新娘。我一直安慰自己溃列,他們只是感情好劲厌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著听隐,像睡著了一般补鼻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天风范,我揣著相機(jī)與錄音咨跌,去河邊找鬼。 笑死硼婿,一個(gè)胖子當(dāng)著我的面吹牛锌半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寇漫,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼刊殉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了州胳?” 一聲冷哼從身側(cè)響起冗澈,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陋葡,沒想到半個(gè)月后亚亲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腐缤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年捌归,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岭粤。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剃浇,到底是詐尸還是另有隱情巾兆,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布虎囚,位于F島的核電站角塑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淘讥。R本人自食惡果不足惜圃伶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒲列。 院中可真熱鬧窒朋,春花似錦、人聲如沸蝗岖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抵赢。三九已至欺劳,卻和暖如春洛退,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杰标。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工兵怯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腔剂。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓媒区,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掸犬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袜漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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