EventBus原理

首先貼上一段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)用。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • EventBus 是一款在 Android 開發(fā)中使用的發(fā)布/訂閱事件總線框架,基于觀察者模式,將事件的接收者和發(fā)...
    SheHuan閱讀 66,185評論 13 186
  • EventBus(發(fā)布訂閱事件總線):通過解耦發(fā)布者和訂閱者簡化android 事件傳遞 EventBus is ...
    JustinJwu閱讀 671評論 0 0
  • 先吐槽一下博客園的MarkDown編輯器,推出的時候還很高興博客園支持MarkDown了,試用了下發(fā)現(xiàn)支持不完善就...
    Ten_Minutes閱讀 651評論 0 2
  • 分析一個開源項目的源碼,首先先從使用的入口開始,然后Debug或者點點點即可。很多時候源碼并不難, 只是被很多人分...
    Alien的小窩閱讀 27,161評論 2 43
  • 項目到了一定階段會出現(xiàn)一種甜蜜的負擔:業(yè)務的不斷發(fā)展與人員的流動性越來越大,代碼維護與測試回歸流程越來越繁瑣。這個...
    fdacc6a1e764閱讀 3,329評論 0 6

友情鏈接更多精彩內(nèi)容