一牺陶、簡(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用法也相當(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í)行我們的方法。
EventBus 負(fù)責(zé)存儲(chǔ)訂閱者下隧、事件相關(guān)信息。訂閱者和發(fā)布者都只和 EventBus 關(guān)聯(lián)谓媒,他們不知道彼此的存在(這是EventBus的優(yōu)點(diǎn))淆院。
訂閱者首先調(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/