如果一個(gè)Android研發(fā)工程師,連EventBus都沒有聽說的,那可能是一個(gè)假的工程師。本問是Android攻城獅必備肉食食品,請(qǐng)務(wù)須按時(shí)食用。
EventBus,是基于事件總線的發(fā)布/訂閱模式。具有超高解耦和簡(jiǎn)潔,是Android攻城獅開發(fā)必備技能。在Android開發(fā)中,常用在不同界面更新數(shù)據(jù),達(dá)到數(shù)據(jù)同步變化,同時(shí),也可在不同線程之間傳遞數(shù)據(jù),能有效加速APP的開發(fā)。
在此,恭維的雙手遞上EventBus的Github地址,請(qǐng)慢。慢食用

項(xiàng)目中導(dǎo)入庫
implementation 'org.greenrobot:eventbus:3.1.1'
使用EvnetBus三步曲
1、定義消息類型
在這里任何一個(gè)實(shí)體類都可以哦,沒有特別的要求。
public static class MessageEvent { /* Additional fields if needed */ }
2、注冊(cè)和解注冊(cè),一般用在Activity或Fragment的生命周期,具體哪個(gè)函數(shù),根據(jù)自己需求進(jìn)行選擇哦。如果不再需要數(shù)據(jù),一定要進(jìn)行解注冊(cè)呢,這是一個(gè)程序員必備的素質(zhì)。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
定義處理事件類型的方法
該方法需要定義在已注冊(cè)的EventBus的中,不然接收不到哦。如果注冊(cè)了EventBus后沒有定義帶有Subscribe注解的方法也會(huì)報(bào)錯(cuò)哦。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
- 該方法必須使用Subscribe注解,public修飾,返回值為void,只能有一個(gè)參數(shù)(事件類型),不能用static,final修飾。
- 該方法的回調(diào)線程默認(rèn)跟post線程一致,就是跟發(fā)送事件的線程在同一線程,可通過指定threadMode的值進(jìn)行修改。
值有一下類型
ThreadMode.POSTING:和post線程同一線程,也是默認(rèn)情況。
ThreadMode.MAIN:在Android主線程回調(diào)。如果post線程也是主線程,那么直接回調(diào),會(huì)阻塞線程,所以不可做耗時(shí)操作。
ThreadMode.MAIN_ORDERED:在Android主線程回調(diào)。不同于MAIN,以隊(duì)列形式被回調(diào),確保不會(huì)阻塞線程。
ThreadMode.BACKGROUND:后臺(tái)線程,post是主線程,訂閱方法運(yùn)行在新的子線程;發(fā)布者是子線程,訂閱方法運(yùn)行在post的線程;
ThreadMode.ASYNC:異步執(zhí)行,訂閱方法執(zhí)行在新的子線程。 - sticky,粘性,默認(rèn)值false。與Android廣播機(jī)制中的sticky概念相同。注冊(cè)之后,訂閱者可以收到最后一條粘性事件。
- priority,優(yōu)先級(jí)。當(dāng)事件發(fā)送后,指定多個(gè)訂閱者收到事件的順序。
3、 post事件
發(fā)送事件后,對(duì)應(yīng)的訂閱者相對(duì)應(yīng)類型的訂閱方法都會(huì)被回調(diào)。然后根據(jù)業(yè)務(wù)需求進(jìn)行處理。
EventBus.getDefault().post(new MessageEvent());
到此,你已經(jīng)學(xué)會(huì)使用EventBus了,可以上手實(shí)戰(zhàn)了?。。?!