上一篇EventBus3.0使用(二)
優(yōu)先級(jí)和事件取消
EventBus也有優(yōu)先級(jí)之分,和廣播類似的,優(yōu)先級(jí)越高,那么就越先獲得事件的回調(diào),并且也可以取消資格事件,就不繼續(xù)往下分發(fā)事件了。但是有一點(diǎn)需要注意的,取消事件只允許在ThreadMode在ThreadMode.PostThread的事件處理方法中。
定義優(yōu)先級(jí) Priorities
@Subscribe(priority = 1)
public void onEvent(MessageEvent event) {
…
}
優(yōu)先高的會(huì)優(yōu)先比優(yōu)先級(jí)低的接收到事件,默認(rèn)優(yōu)先級(jí)為0,并且并不會(huì)因?yàn)門hreadMode而影響到順序。
取消事件傳遞
@Subscribe
public void onEvent(MessageEvent event){
// Process the event
…
EventBus.getDefault().cancelEventDelivery(event) ;
}
事件通常是由更高優(yōu)先級(jí)的用戶取消。并且僅限于在發(fā)布線程運(yùn)行ThreadMode.PostThread事件處理。
訂閱者索引
對(duì)于上面所描述的EventBus的功能,是通過(guò)Java反射來(lái)獲取訂閱方法,這樣以來(lái)大大降低了EventBus的效率,同時(shí)也影響了我們應(yīng)用程序的效率。其實(shí)對(duì)于反射的處理解析不僅僅只能夠通過(guò)Java反射的方式來(lái)進(jìn)行,還能夠通過(guò)apt(Annotation Processing Tool)來(lái)處理。為了提高效率,EventBus提供這中方式來(lái)完成EventBus的執(zhí)行過(guò)程。下面就來(lái)看一下對(duì)于EventBus的另一種使用方式。
- 添加以下到Gradle build
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
apt {
arguments {
eventBusIndex "com.example.myapp.MyEventBusIndex"
}
}
- 在當(dāng)我們使用EventBus以后,在我們的項(xiàng)目沒(méi)有錯(cuò)誤的情況下重新rebuild之后會(huì)在build目錄下面生成MyEventBusIndex文件,文件名可以自定義。下面就來(lái)看一下如何使用這個(gè)MyEventBusIndex。
我們可以自定義設(shè)置自己的EventBus來(lái)為其添加MyEventBusIndex對(duì)象。代碼如下所示:
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
- 我們也能夠?qū)yEventBusIndex對(duì)象安裝在默認(rèn)的EventBus對(duì)象當(dāng)中。代碼如下所示:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
// Now the default instance uses the given index. Use it like this:
EventBus eventBus = EventBus.getDefault();
剩下對(duì)于EventBus的用法則是一模一樣。當(dāng)然也建議通過(guò)添加訂閱者索引這種方式來(lái)使用EventBus,這樣會(huì)比通過(guò)反射的方式來(lái)解析注解效率更高。