-
概念
- Eventbus是一個專門為Android平臺優化定制的事件總線函數庫,事件總線,繼承自觀察者模式,也是基于發布訂閱的機制來實現事件的發送與接收的
-
基本用法
- 定義一個事件類
MessageEvent
- 定義一個訂閱方法,使用
@Subscribe
指定訂閱方法所在線程 - 注冊和反注冊訂閱方法
- 發送事件
- 定義一個事件類
-
源碼詳解
-
重要成員變量
-
subscriptionsByEventType
:以event事件為key,以訂閱者列表為value -
typesBySubscriber
:訂閱者集合,以訂閱者類為key,以訂閱者所有event事件列表為value -
stickyEvents
:保存的是粘性事件 HandlerPoster
BackgroundPoster
AsyncPoster
-
-
@Subscribe
的注解- 當我們指定訂閱方法的時候,會在方法上加上注解
@Documented //命名為 java doc 文檔 @Retention(RetentionPolicy.RUNTIME) //指定在運行時有效,即在運行時能保持這個 Subscribe @Target({ElementType.METHOD}) //指定類型為 METHOD,表名用來描述方法 public @interface Subscribe { //指定線程模式,可以指定在 Subscribe 中接收的 Event 所處的線程 ThreadMode threadMode() default ThreadMode.POSTING; boolean sticky() default false; int priority() default 0; }
- 源碼流程
-
Eventbus創建
- 單例模式、建造者模式
-
Regitster注冊
- 通過反射獲取到訂閱者的 Class 對象
- 通過 Class 對象找到對應的訂閱者方法集合
- 首先從緩存取出subscriberMethods,如果有則直接返回該方法列表(
ConcurrentHashMap
) - 根據是否忽略生成 index標記位(優化,
EventBusAnnotationProcessor
編譯時期生成方法索引,默認false) - 忽略通過反射
findUsingReflection()
- 創建并初始化 FindState 對象(封裝了所有的訂閱者和訂閱方法的集合)
- 使用反射的方式獲取單個類的訂閱方法
- 忽略非 public 和 static 的方法
- 篩選只有一個參數、有 Subscribe 的注解的訂閱方法
- 檢查 eventType 決定是否訂閱,不能有多個eventType 相同的訂閱方法
- 將訂閱方法加入
SubscriberMethod
- 不忽略通過
findUsingInfo
- 首先從緩存取出subscriberMethods,如果有則直接返回該方法列表(
-
subscribe ()
遍歷訂閱者方法集合,將訂閱者和訂閱者方法訂閱起來- 判斷是否訂閱過事件,如果該
newSubscription
(封裝訂閱者和訂閱方法信息)已經被訂閱過,拋出異常 - 按照優先級插入
subscriptions
(typesBySubscriber value
的list
) - 判斷是否為粘性事件,是的話考慮是否繼承關系
- 發送粘性事件給
newSubscription
- 判斷是否訂閱過事件,如果該
-
Post分發
- 獲取當前線程的 posting 狀態
- 獲取當前事件隊列
- 將事件添加進當前線程的事件隊列
-
postSingleEvent()
不斷從隊列獲取事件進行分發- 依次遍歷訂閱者
-
postToSubscription()
根據threadMode進行不同Poster分發 -
invokeSubscriber()
最終訂閱者接收到了事件,反射調用訂閱方法
-
UnRegitster反注冊
- 根據
typesBySubscriber
逐個取消訂閱者所有訂閱事件
- 根據
-
-
Android開源框架如何說-EventBus3
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 前邊文章主要跟大家大概講了下EventBus的用法和注解,接下來則是從源碼角度來看EventBus的內部處理 Ev...
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...