一、簡(jiǎn)介:
EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線(xiàn)。
主要功能:替代Intent,Handler,BroadCast在Fragment,Activity,Service,線(xiàn)程之間傳遞消息。(避免了使用handler、AsynTask,接口回調(diào))
優(yōu)點(diǎn):開(kāi)銷(xiāo)小,代碼更優(yōu)雅,將發(fā)送者和接收者進(jìn)行解耦。獨(dú)立出一個(gè)發(fā)布訂閱模塊,調(diào)用者可以通過(guò)使用這個(gè)模塊,屏蔽一些線(xiàn)程切換問(wèn)題,簡(jiǎn)單地實(shí)現(xiàn)發(fā)布訂閱功能。
缺點(diǎn):大量的濫用,將導(dǎo)致邏輯的分散,出現(xiàn)問(wèn)題后很難定位。
總得來(lái)說(shuō),如果項(xiàng)目里面有大量的事件交互,那么還是可以通過(guò)EventBus來(lái)實(shí)現(xiàn),否則還是推薦自己在模塊內(nèi)部實(shí)現(xiàn)觀察者模式
二、基本用法
EventBus框架中涉及四個(gè)成分:訂閱者,發(fā)布者,訂閱事件,事件總線(xiàn),他們的關(guān)系:

EventBus用法也相當(dāng)簡(jiǎn)單:
(http://www.cnblogs.com/xijin-wu/p/5293212.html)
著重看一下響應(yīng)事件的四個(gè)函數(shù):
onEvent:?
該事件在哪個(gè)線(xiàn)程發(fā)出來(lái)的,onEvent就會(huì)在這個(gè)線(xiàn)程中運(yùn)行,也就是說(shuō)發(fā)布事件和接收事件線(xiàn)程在同一個(gè)線(xiàn)程(EventBus是如何做到的呢?)。使用這個(gè)方法時(shí),在onEvent方法中不能執(zhí)行耗時(shí)操作,如果執(zhí)行耗時(shí)操作容易導(dǎo)致事件分發(fā)延遲。
onEventMainThread:?
不論事件是在哪個(gè)線(xiàn)程中發(fā)布出來(lái)的,onEventMainThread都會(huì)在UI線(xiàn)程中執(zhí)行。這個(gè)在Android中是非常有用的,因?yàn)樵贏ndroid中只能在UI線(xiàn)程中更新UI,所以在onEvnetMainThread方法中是不能執(zhí)行耗時(shí)操作的。
onEventBackground:
如果事件是在UI線(xiàn)程中發(fā)布出來(lái)的,那么onEventBackground就會(huì)在子線(xiàn)程中運(yùn)行,如果事件本來(lái)就是子線(xiàn)程中發(fā)布出來(lái)的,那么onEventBackground函數(shù)直接在該子線(xiàn)程中執(zhí)行。
onEventAsync:
無(wú)論事件在哪個(gè)線(xiàn)程發(fā)布,都會(huì)創(chuàng)建新的子線(xiàn)程在執(zhí)行onEventAsync.
發(fā)送時(shí)發(fā)送的是這個(gè)類(lèi)的實(shí)例,接收時(shí)參數(shù)就是這個(gè)類(lèi)實(shí)例。
當(dāng)發(fā)過(guò)來(lái)一個(gè)消息的時(shí)候,EventBus怎么知道要調(diào)哪個(gè)函數(shù)呢,就看哪個(gè)函數(shù)傳進(jìn)去的參數(shù)是這個(gè)類(lèi)的實(shí)例,哪個(gè)是就調(diào)哪個(gè)。那如果有兩個(gè)是呢,那兩個(gè)都會(huì)被調(diào)用?。。?!
三、源碼解析
簡(jiǎn)單理解(猜測(cè))EventBus的實(shí)現(xiàn)原理:
當(dāng)我們使用EventBus.getDefault().register(this)將當(dāng)前類(lèi)注冊(cè)到EventBus類(lèi)時(shí),EventBus會(huì)掃描當(dāng)前類(lèi),把所有onEvent開(kāi)頭的方法記錄下來(lái)。如何記錄呢?使用Map,Key為方法的參數(shù)類(lèi)型,Value中包含我們的方法。即,以鍵值對(duì)的方式被存儲(chǔ)到EventBus中了。其中key是自定義的事件(Event.class),value是響應(yīng)該事件的所有類(lèi)(舉例,A.class,B.class)。
當(dāng)發(fā)送一個(gè)Event后,EventBus會(huì)根據(jù)post中實(shí)參(即Event)的類(lèi)型,去Map中查找對(duì)應(yīng)的方法,最終通過(guò)調(diào)用反射去執(zhí)行我們的方法。

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

訂閱者首先調(diào)用 EventBus 的 register 接口訂閱某種類(lèi)型的事件,當(dāng)發(fā)布者通過(guò) post 接口發(fā)布該類(lèi)型的事件時(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-餓了么開(kāi)源的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/