一、概述
EventBus 是一款針對(duì) Android 優(yōu)化的發(fā)布/訂閱事件總線顶瞒。主要功能是替
Intent,Handler,BroadCastReceiver 在 Fragment控淡,Activity嫌吠,Service,線程之間傳遞消息掺炭。
優(yōu)點(diǎn)是開銷小,代碼更優(yōu)雅凭戴。以及將發(fā)送者和接收者解耦涧狮。
二、基本使用
gradle集成
compile 'org.greenrobot:eventbus:3.0.0'
自定義需攜帶傳遞的參數(shù)的類么夫,因?yàn)閭鬟f的是一個(gè)對(duì)象者冤,如:
public class FirstEvent{
private String mMsg;
public FirstEvent(String msg){
mMsg = msg;
}
public String getmMsg(){
return mMsg;
}
}
-
在需要接收消息的 Activity/Fragment 中注冊(cè)和反注冊(cè)
- 在
onCreate()
中注冊(cè):EventBus.getDefault().register(this);
- 在
onDestroy()
中反注冊(cè):EventBus.getDefault().unregister(this);
- 在需要發(fā)送信息的時(shí)候:
EventBus.getDefault().post(event);
- 在
重寫回調(diào)的接收信息和處理的訂閱函數(shù),用 @Subscribe + 模式 修飾档痪,如:
PS: 系統(tǒng)是根據(jù)@Subscriber
這個(gè)注解來確定訂閱函數(shù)的
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.d("eventbus", msg);
text1.setText(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
修飾的線程模式有 4 種:
ThreadMode.Main:表示這個(gè)方法在主線程中執(zhí)行(適合做異步加載涉枫,可以將子線程 加載到數(shù)據(jù)直接設(shè)置到 UI 界面)。
ThreadMode.Posting:表示該方法和消息發(fā)送方在同一個(gè)線程腐螟。
ThreadMode.ASYNC:表示無論發(fā)送方是在子線程還是在主線程愿汰,都會(huì)開一個(gè)新的子線程去運(yùn)行困后,適用于多個(gè)線程任務(wù),內(nèi)部有線程池管理衬廷,比如請(qǐng)求網(wǎng)絡(luò)時(shí)摇予,用這個(gè)方法,他會(huì)自動(dòng)創(chuàng)建方法去請(qǐng)求吗跋,可以異步并發(fā)處理侧戴。
ThreadMode.BackGround:表示該方法在后臺(tái)運(yùn)行(也就是子線程),不能夠并發(fā)處理跌宛,如果發(fā)布者在子線程酗宋,那么該方法就在子線程執(zhí)行。如果發(fā)布者在主線程疆拘,那么該方法就會(huì)創(chuàng)建一個(gè)子線程蜕猫,在子線程運(yùn)行。