EventBus實現原理(手寫核心邏輯)

解釋一下反射:

JAVA反射機制是在運行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。

EventBus核心流程圖總結:

發佈者post發送一個事件,處理器根據發佈的數據類型,然後分配給訂閱者方法回調裏面。

  • 先註冊
  • 通過反射拿到所有的這個類的方法
  • 判斷這個類有沒有註解,然後存起來。
  • 然後獲取到註解的值來判斷需不需要轉換線程
  • 在post方法裏面通過反射,調用這個類方法。
第一步: 聲明Subscribe註解
/**
* @Retention 用於聲明該註解生效的生命週期,有三個枚舉值可以選擇<br>
 * 1. RetentionPolicy.SOURCE 註釋只保留在源碼上面,編譯成class的時候自動被編譯器抹除
 * 2. RetentionPolicy.CLASS 註釋只保留到字節碼上面,VM加載字節碼時自動抹除
 * 3. RetentionPolicy.RUNTIME 註釋永久保留,可以被VM加載時加載到內存中
 * 注意:由於我們的目的是想在VM運行時對Filed上的該註解進行反射操作,因此Retention值必須設置爲RUNTIME
 *
 * @Target 用於指定該註解可以聲明在哪些成員上面,常見的值有FIELD和Method,
      由於我們的當前註解類是想聲明在Filed上面
 * 因此這裏設置爲ElementType.FIELD。
 * 注意:如果@Target值不設置,則默認可以添加到任何元素上,不推薦這麼寫。
 *
 * @interface 是聲明註解類的組合關鍵字。
 */

@Target({java.lang.annotation.ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Subscribe{
   
}

在這裏插入圖片描述

第二步:創建註解裏面的類型,也就是線程類型

在這裏插入圖片描述

第三步: 訂閱者先進行註冊(其實就是存數據到map中)

在這裏插入圖片描述
在這裏插入圖片描述

第四步:把每個消息封裝成一個對象

在這裏插入圖片描述

第五步: 通過反射找到所有用註解聲明的方法,以類名爲key存放到map中

在這裏插入圖片描述

第六步: 發送post事件

在這裏插入圖片描述

第七步: 切換線程調度

在這裏插入圖片描述
在這裏插入圖片描述

第八步: 解除註冊

在這裏插入圖片描述

Activity中的調用方法:
在這裏插入圖片描述

在這裏插入圖片描述

粘性事件?
就是在點擊的時候觸發,接收消息,完全可以根據本身的類,在map中找到消息,然後根據類型判斷, 如果有,通過反射調用

總結:

優點:

  • EventBus簡潔、強大
  • 不用寫回調接口
  • 可以組件、線程間的相互通信

缺點:

  • 事件的處理(偵聽)是通過方法的參數類型來確定的,要定義多個Message
  • 問題查看定位比較麻煩,應爲有多個post同時發過來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章