EventBus事件總線.以觀察者模式實(shí)現(xiàn),消息推送/訂閱.用于Android組件之間相互通信。
(定義:針對(duì)事件提供統(tǒng)一訂閱屏轰,發(fā)布以達(dá)到組件間通信的解決方案署海。 原理:觀察者模式氛琢。發(fā)送者把消息發(fā)送到事件總線,然后事件總線在接收者中查找哪些方法注冊(cè)了這個(gè)事件疤剑,如果某個(gè)方法注冊(cè)了這個(gè)事件滑绒,就觸發(fā)該方法。)隘膘。事件總線框架提供了一種更靈活更強(qiáng)大而又更加完美解耦的解決方案疑故,在很多場合,從開發(fā)效率弯菊,執(zhí)行性能和設(shè)計(jì)思路上都要優(yōu)于BroadcastReceiver纵势。
官方工作原理截圖如下:
android的應(yīng)用場景,主要應(yīng)用于組件間的通信,activity 钦铁、service软舌、fragment、后臺(tái)線程之間傳遞數(shù)據(jù)牛曹。
怎么使用:
gradle:compile'org.greenrobot:eventbus:3.1.1'
簡單使用步驟:
1,定義事件類
事件類是通信過程中的數(shù)據(jù)的載體,用來傳遞數(shù)據(jù),這里寫一個(gè)最簡單的事件類,后面說如何傳遞數(shù)據(jù)
public class MessageEvent {
}
2.注冊(cè)事件
上面提到數(shù)據(jù)的發(fā)送者和接收者, 注冊(cè)事件是針對(duì)接收者的, 哪個(gè)組件需要接收消息,就在哪個(gè)組件中去注冊(cè)
注冊(cè):
EventBus.getDefault().register(this);
添加函數(shù)注解@Subscribe:當(dāng)數(shù)據(jù)的發(fā)送者發(fā)出消息后,添加這個(gè)注解的函數(shù)會(huì)被調(diào)用
添加@Subscribe注解的函數(shù)參數(shù),寫上接收事件類型,表示這個(gè)組件會(huì)接收這類事件的消息
注銷:
EventBus:EventBus.getDefault().unregister(this);
Note:一個(gè)事件是可以有多個(gè)接收者(訂閱者)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Subscribe
public void receiveMessage(MessageEvent messageEvent){
Log.i(TAG,"messageEvent");
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.發(fā)送事件
發(fā)送事件@Subscribe注解的函數(shù)會(huì)被調(diào)用
EventBus.getDefault().post(newMessageEvent());
githup事例:
@Override
public void onStart() {
super.onStart();EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();EventBus.getDefault().unregister(this);
}
注意:注冊(cè)和解除注冊(cè)不應(yīng)該寫了這2個(gè)方法里佛点,應(yīng)寫在onCreate onDestroy 函數(shù)中。
上面是EventBus的基本使用流程
android的具體用例:
在事件中傳遞數(shù)據(jù)
指定事件接收線程
發(fā)送黏性事件Sticky Events
接收事件的優(yōu)先級(jí)別
中止事件傳遞
訂閱者索引
** 傳遞數(shù)據(jù):**
使用場景黎比,如果個(gè)人中心更新用戶頭像超营,但是有的時(shí)候app首頁展示用戶頭像,這個(gè)時(shí)候首頁的用戶頭像應(yīng)該刷新阅虫。
1演闭、新定義一個(gè)事件:
public class UpdatePicEvent {
private StringpicUrl;
public StringgetPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
}
2、發(fā)送事件用新的自定義事件
//點(diǎn)擊上傳圖片颓帝,server端返回url
UpdatePicEvent picEvent =new UpdatePicEvent();
picEvent.setPicUrl("http://xxx.com/20180725.png");
EventBus.getDefault().post(new UpdatePicEvent());
3.在接收消息的回調(diào)中用get方法去獲取
@Subscribe
public void receiveMessage(UpdatePicEvent updatePicEvent){
Log.i(TAG,"url:"+updatePicEvent.getPicUrl());
}
指定事件接收的線程
@Subscribe注解,這個(gè)函數(shù)在消息推送之后會(huì)被回調(diào),該注解有幾個(gè)屬性米碰,threadMode能為該函數(shù)指定線程,如果不寫,也會(huì)有個(gè)默認(rèn)值:ThreadMode.POSTING,意思是和發(fā)送事件所在線程一樣
ThreadMode列表
ThreadMode.POSTING:和發(fā)送事件在同一個(gè)線程
ThreadMode.MAIN:主線程
ThreadMode.BACKGROUND:子線程
ThreadMode.ASYNC:異步線程
發(fā)送黏性事件Sticky Events
上面事例情況是,發(fā)送者發(fā)送消息购城,訂閱者立馬收到消息见间,他會(huì)把消息推送給所有訂閱者,如果你希望在消息推送完成之后,讓新注冊(cè)的訂閱者也能收到這條消息,這時(shí)候你可以試試Sticky Events工猜,達(dá)到需要配置2點(diǎn)
1.首先,發(fā)送的是黏性事件,代碼將post改為postSticky
UpdatePicEvent picEvent =new UpdatePicEvent();
picEvent.setPicUrl("http://xxx.com/20180725.png");
EventBus.getDefault().postSticky(picEvent);
2.然后,訂閱者要聲明自己能夠接收到黏性事件的消息:代碼中@Subscribe注解中的sticky值為true
@Subscribe(sticky =true)
public void receiveMessage(UpdatePicEvent picEvent){
Log.e("chen","receiveMessage");
}
第二條消息和第一條消息有間隔5s
接收事件的優(yōu)先級(jí)別
EventBus可以定義接收事件方的優(yōu)先級(jí)別,在@Subscribe注解中有一個(gè)priority的參數(shù)默認(rèn)值是0,可以自行配置1.2.3.4...數(shù)值越大優(yōu)先級(jí)越高,會(huì)越早收到消息米诉,如果都是默認(rèn)值0 誰先注冊(cè)誰先收到消息
@Subscribe(priority =4)
public void receiveMessage(UpdatePicEvent picEvent){
Log.e("chen","GoodsDetailsActivity:"+picEvent.getPicUrl());
}
中止事件傳遞
類似于有序廣播,優(yōu)先級(jí)高的訂閱者,可以終止事件向下傳遞,EventBus也提供了此功能
@Subscribe(priority =0)
public void receiveMessage(UpdatePicEvent updatePicEvent){
Log.e("chen","MainActivity:"+updatePicEvent.getPicUrl());
EventBus.getDefault().cancelEventDelivery(updatePicEvent);
}