EventBus:是用來(lái)簡(jiǎn)化android組建之間的通信,otto也能完成,但效率院低于eventbus。Eventbus
基于觀察者模式,一個(gè)事件的訂閱者,一個(gè)事件的發(fā)布者
使用方式:添加依賴 compile 'org.greenrobot:eventbus:3.0.0'
在onCreate中注冊(cè)總線事件:EventBus.getDefault().register(this);
在onDestroy中注銷事件:EventBus.getDefault().unregister(this);
使用注解@Subsribe訂閱方法:
@Subscribe(threadMode = ThreadMode.MAIN,priority =1)
public void onMessageEvent(MyEvent event) {
Logger.d("message is " + event.getMsg());
? ? // 更新界面
? ? EventBus2.setText(event.getMsg());
}
發(fā)布事件:EventBus.getDefault().post(messageEvent);
EventBus3.0有四種線程模型,分別是:
POSTING (默認(rèn))? 表示事件處理函數(shù)的線程跟發(fā)布事件的線程在同一個(gè)線程。
MAIN 表示事件處理函數(shù)的線程在主線程(UI)線程,因此在這里不能進(jìn)行耗時(shí)操作。
BACKGROUND 表示事件處理函數(shù)的線程在后臺(tái)線程,因此不能進(jìn)行UI操作。如果發(fā)布事件的線程是主線程(UI線程),那么事件處理函數(shù)將會(huì)開(kāi)啟一個(gè)后臺(tái)線程,如果果發(fā)布事件的線程是在后臺(tái)線程,那么事件處理函數(shù)就使用該線程。
ASYNC 表示無(wú)論事件發(fā)布的線程是哪一個(gè),事件處理函數(shù)始終會(huì)新建一個(gè)子線程運(yùn)行,同樣不能進(jìn)行UI操作。
事件優(yōu)先級(jí):一個(gè)事件有幾個(gè)方法訂閱的時(shí)候,并且在一個(gè)線程模型下,可以配置優(yōu)先級(jí)來(lái)決定調(diào)用的先后順序,priority默認(rèn)為0,數(shù)值越大優(yōu)先級(jí)越高。
粘性事件:事件提前發(fā)送出來(lái),當(dāng)某類注冊(cè)后并且有事件的訂閱方法后,馬上調(diào)用。eventbus內(nèi)部做了緩存。
發(fā)布:EventBus.getDefault().postSticky("RECOGNIZE_SONG");
接收:@Subscribe(threadMode = ThreadMode.MAIN, sticky =true)
? ? public void receiveSoundRecongnizedmsg(String insType) {
? ? ? ? if("RECOGNIZE_SONG".equals(insType)) {
? ? ? ? ? ? soundRecognizeCtrl();
? ? ? ? }
? ? }
移除:EventBus.getDefault().removeStickyEvent(stickyEvent);
3.0后通過(guò)注解反射的方式標(biāo)識(shí)訂閱方法
增加了:annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
app的gradle中增加:
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex:'com.example.dell.wx.MyEventBusIndex',
verbose? ? ? :'true']
} }
在application中增加:EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();初始化EventsBus的單例。
3.0后EventBus將onEvent開(kāi)頭的方法都視為訂閱方法,通過(guò)后拼接的字符串來(lái)區(qū)分線程模型。
1、onEvent:
2、onEventMainThread:
3、onEventBackground:
4、onEventAsync:
與之前的四種模型一一對(duì)應(yīng)。
未完待續(xù)。。。。。。