-
What
EventBus是一種在Java和Android中使用的基于發(fā)布/訂閱的事件模型信认,可以廣泛使用在Activity材义、Fragment和線程之間通信,由于它的簡(jiǎn)易嫁赏、快速其掂、輕便和可配置等特點(diǎn)被廣泛使用。
-
How
在使用之前需在app/build.gradle文件下添加EventBus所需的依賴橄教,EventBus的GitHub倉庫地址清寇。
首先需要定義事件類型,用于發(fā)布者發(fā)布出去护蝶。
public static class MessageEvent {
public String message;
public MessageEvent(String message) {
this.message = message;
}
}
準(zhǔn)備訂閱者华烟,訂閱者可以是Activity、Fragment或者線程持灰,如果是Activity盔夜,需要在onStart和onStop方法中注冊(cè)和解除注冊(cè)事件總線,如果是Fragment堤魁,在onViewCreated和onDestroyView中注冊(cè)和解除注冊(cè)事件總線喂链,還需要實(shí)現(xiàn)接收到事件的處理方法,通過@Subscribe注解妥泉,方法名沒有要求椭微,但是訪問權(quán)限必須是public,參數(shù)必須是一個(gè)事件類型盲链,而且只能有一個(gè)參數(shù)蝇率,返回類型必須是void。在相應(yīng)的事件發(fā)出后刽沾,對(duì)應(yīng)的處理方法會(huì)被調(diào)用本慕。
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void handleEventMessage(SecondFragment.MessageEvent messageEvent){
mFirstTextView.setText(messageEvent.message);
}
發(fā)布者可以在任何地方發(fā)出一個(gè)消息,消息通過事件總線傳遞侧漓,注冊(cè)了的訂閱者就會(huì)收到消息锅尘,對(duì)應(yīng)的處理方法會(huì)被調(diào)用。
mSecondButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: " + Thread.currentThread().getId());
EventBus.getDefault().post(new MessageEvent("hello,second fragment"));
}
});
-
threadMode
EventBus具有四種線程模式布蔗,用于對(duì)訂閱者的事件處理方法執(zhí)行在哪一個(gè)線程進(jìn)行說明藤违。默認(rèn)使用的是POSTING,發(fā)布事件和處理事件方法執(zhí)行在同一個(gè)線程纵揍,這種模式下纺弊,發(fā)布和訂閱是同步完成的,一旦發(fā)布骡男,所有訂閱者都能收到事件消息,這個(gè)模式避免了線程切換傍睹,開銷較小隔盛,但是需要快速返回犹菱,防止阻塞發(fā)布者所在線程;MAIN模式下訂閱者處理方法會(huì)被主線程執(zhí)行吮炕,需要避免處理方法過于耗時(shí)腊脱,導(dǎo)致ANR;MAIN_ORDERED相比與main龙亲,訂閱者收到和執(zhí)行的消息是有序的陕凹;BACKGROUND判斷發(fā)布消息的線程是否在 UI 線程,如果不是的話直接反射調(diào)用鳄炉,是的話通過backgroundPoster的enqueue()方法 將方法加入到后臺(tái)的一個(gè)隊(duì)列杜耙,最后通過線程池去執(zhí)行;ASYNC邏輯實(shí)現(xiàn)類似于BACKGROUND拂盯,將任務(wù)加入到后臺(tái)的一個(gè)隊(duì)列佑女,最終由Eventbus 中的一個(gè)線程池去調(diào)用。
-
strickEvent
粘性事件谈竿,普通事件需要訂閱者注冊(cè)以后才能收到發(fā)布者發(fā)出的事件团驱,而粘性事件可以將最新的事件保存在內(nèi)存中,將來注冊(cè)的訂閱者也可以接收到之前最新的事件空凸。發(fā)送的粘性事件會(huì)保存在一個(gè) map 中嚎花,這樣才能實(shí)現(xiàn)后訂閱也能接收到的功能,同時(shí)會(huì)保留最后一個(gè)粘性事件呀洲。對(duì)于某些只處理一次的事件紊选,會(huì)造成重復(fù)處理最后一個(gè)粘性事件的情況,有時(shí)這是不符合預(yù)期的两嘴,需要在處理完粘性事件后手動(dòng)將其刪除丛楚,使用 removeStickyEvent()方法進(jìn)行移除。