解釋一下反射:
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同時發過來。