一、Event Bus是什麼
Event Bus是一種消息發布/訂閱機制,它允許組件之間進行解耦。在Event Bus中,組件可以將消息發布到某個主題或者訂閱某個主題,當主題發布消息時,所有訂閱該消息的組件都會收到該消息。
Event Bus是由Otto團隊開發的,它依賴註解處理器和Java的反射機制。
二、Event Bus的基本使用方法
在使用Event Bus之前,需要在gradle中添加依賴:
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
在發布消息的組件中,需要定義一個事件類,包含需要發布的數據:
public class MessageEvent {
public final String message;
public MessageEvent(String message){
this.message = message;
}
}
發布消息時,需要將事件類的實例傳遞給Event Bus:
EventBus.getDefault().post(new MessageEvent("Hello World!"));
在訂閱消息的組件中,需要定義一個接收方法,該方法使用@Subscribe註解進行標記,並且該方法的參數包含需要訂閱的事件類:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();
}
同時需要在onStart方法中註冊,onStop方法中取消註冊:
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
三、Event Bus的原理
Event Bus的原理是基於觀察者模式,通過動態的生成代碼,實現事件分發的效果。
在訂閱者註冊時,Event Bus通過註解處理器處理訂閱者的類,生成對應的訂閱者方法並加入訂閱者列表中。在訂閱者方法中,Event Bus將接收到的事件對象保存下來並加入事件隊列中。
而在事件發布時,Event Bus將事件通過線程池中的線程非同步分發出去,Event Bus會遍歷訂閱者列表,並根據訂閱者方法中定義的註解來進行對應訂閱者的調用。
為了保證線程的安全,Event Bus默認採用的線程模式是PostThreadMode,即在發布事件的線程中進行訂閱者的方法調用。同時Event Bus也提供了其他三種線程模式:MainThread,BackgroundThread和AsyncThread。
四、Event Bus的常見問題和解決方法
1、如何避免方法名一致導致的誤調用問題?
使用Event Bus的ProGuard插件,保證訂閱者方法的混淆。
2、如何避免內存泄漏問題?
在訂閱者中,不要將訂閱者本身作為事件對象發布,否則很容易造成內存泄漏。同時在Activity的onStop方法中,一定要調用Event Bus的unregister方法,否則會持有Activity的引用。
3、如何解決發布到BackgroundThread時UI操作的問題?
使用MainThread線程模式,將方法標記為@UiThread即可解決UI操作問題。
五、參考資料
1、官方文檔:https://github.com/greenrobot/EventBus
2、博客文章:https://www.jianshu.com/p/303f94e0ce71
3、源碼分析:https://blog.csdn.net/u011240877/article/details/79681408
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248784.html