首先貼上一段github上面EventBus官方的解釋圖:

翻譯過來大概就是
EventBus是一個事件發(fā)布/訂閱總線,適用于Android和Java。
1.組件之間的通信更加簡單?
? ? 。針對在事件的發(fā)送者和訂閱者之間進行解耦?
? ? 。非常好的運用在Activitys、Fragments和后臺線程?
? ? 。避開了聯(lián)系緊密易出錯的依賴關系和容易出錯生命周期?
2.使你的代碼更加簡潔?
3.快?
4.輕量級(小于50K的jar包)?
5.有100,00,000+的app使用了EventBus
Eventbus主要三個角色:
Event:事件??梢允侨我忸愋偷膶ο?/p>
Subscriber:事件訂閱者,接收特定的事件。在EventBus中,使用約定來指定事件訂閱者以簡化使用。即所有事件訂閱都都是以onEvent開頭的函數(shù),具體來說,函數(shù)的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync這四個,這個和ThreadMode(下面講)有關。
Publisher:事件發(fā)布者,用于通知 Subscriber 有事件發(fā)生。可以在任意線程任意位置發(fā)送事件,直接調(diào)用eventBus.post(Object) 方法,可以自己實例化 EventBus對象,但一般使用默認的單例就好了:EventBus.getDefault(), 根據(jù)post函數(shù)參數(shù)的類型,會自動調(diào)用訂閱相應類型事件的函數(shù)。
流程分析:
1、初始化 getDefault()?
EventBus3.0使用單例模式,但是同時也提供了public的構造函數(shù),每個EventBus實例都是一條事件總線。
2、注冊 register(subscriber)
注冊的流程就是通過subscriber查詢所有的method方法。并將這些method和subscriber組合分別存入三個Map數(shù)據(jù)結(jié)構中。?
3、發(fā)送事件 post(event)?
發(fā)送事件并完成線程間的切換的本質(zhì)是通過反射、Handler的handleMessage()方法、線程池的execute()方法最終實現(xiàn)。EventBus內(nèi)部維護了一個緩存線程池,用來管理線程。
ThreadMode線程通信:
????????MAIN UI主線程
????????BACKGROUND 后臺線程
????????POSTING 和發(fā)布者處在同一個線程
????????ASYNC 異步線程
可以很簡單的實現(xiàn)線程間的切換,包括后臺線程、UI線程、異步線程,使用如下:

這里有一個細節(jié)要注意一下,就是BACKGROUND和ASYNC的區(qū)別:
????????1,background模式中,如果是在主線程post事件,則使用BackGroundPoster新開線程(是線程安全的),如果是在子線程post事件,則直接在該子線程反射invokeSubscribe調(diào)用方法,是非線程安全的?
????????2、async模式中,不管post事件是在那里發(fā)送的,直接使用AsyncPoster新開線程。(非線程安全的)
至于原理,通俗一點的來講,就是在一個單例內(nèi)部維持著一個map對象,調(diào)用register(subscriber)通過subscriber查詢所有的method方法。并將這些method和subscriber組合分別存入三個Map數(shù)據(jù)結(jié)構中。相當于把一個個事件(Event)添加到總線上,然后post(event)的時候,根據(jù)post傳入的參數(shù),去找到匹配的方法,反射調(diào)用。