| ThreadMode | 執行執行緒 | 適用場景 |
POSTING (預設) | 發布執行緒 | 輕量操作,不可耗時 |
MAIN | UI 主執行緒 | 更新 UI、Toast、Dialog |
BACKGROUND | 後台執行緒 (發布在 UI 則新建,否則沿用) | 耗時運算、資料庫、網路請求 |
ASYNC | 新建獨立後台執行緒 | 極耗時任務、完全隔離發布者 |
完整使用流程
1. 依賴引入
implementation 'org.greenrobot:eventbus:3.0.0'
2. 定義事件類
public class MessageEvent {
private String message;
public MessageEvent(String msg) { this.message = msg; }
public String getMessage() { return message; }
}
3. 註冊/註銷 (通常在 Activity/Fragment 生命週期)
@Override protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override protected void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
4. 發送事件
// 任意執行緒、任意位置
EventBus.getDefault().post(new MessageEvent("下載完成"));
5. 處理事件 (方法名任意,需 public + @Subscribe)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
textView.setText(event.getMessage());
Toast.makeText(this, event.getMessage(), Toast.LENGTH_SHORT).show();
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackground(MessageEvent event) {
// 執行耗時操作
}
實戰範例:跨 Activity 傳遞下載結果

MainActivity (訂閱者,展示四種線程模型 ID)
public class MainActivity extends AppCompatActivity {
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPost(MessageEvent e) { tvDefault.setText(Thread.currentThread().getId()+""); }
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMain(MessageEvent e) {
tvMain.setText(Thread.currentThread().getId()+"");
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackground(MessageEvent e) { tvBackground.setText(Thread.currentThread().getId()+""); }
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsync(MessageEvent e) { tvAsync.setText(Thread.currentThread().getId()+""); }
}
FirstActivity (發布者,子執行緒模擬下載)
btn.setOnClickListener(v -> new Thread(() -> {
Thread.sleep(1000);
EventBus.getDefault().post(new MessageEvent("網絡下載的文本"));
}).start());
進階特性
- Sticky Event:
postSticky(event),新訂閱者立即收到最近一次黏性事件(適合初始化數據)
- 優先級:
@Subscribe(priority = 1),數值大者優先接收,可攔截/修改事件
- 事件繼承:訂閱父類事件可接收子類事件
- ProGuard 保護:
-keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe *; }
常見坑與避坑指南
- 忘記
unregister → 記憶體洩漏、重複接收
- POSTING 模式執行耗時操作 → 卡死發布執行緒 (若為 UI 則 ANR)
- 事件類未定義 public 建構子 → 反序列化/黏性事件失效
- 模組化專案需使用
EventBus.builder().installDefaultEventBus() 共享實例
- 上一篇文章: RxJava 操作符大全:過濾類操作符詳解與實戰範例
- 下一篇文章: Swift 專案整合 MMDrawerController 實現側滑抽屜效果完整教學
Copyright ©
程式碼之家 All Rights Reserved