前一篇文章簡(jiǎn)單介紹了EventBus 3.0的用法,現(xiàn)在是時(shí)候詳解其用法了。首先聲明,EventBus 3.0的改動(dòng)針對(duì)2.4的改動(dòng)并不是特別大,但是對(duì)于其性能的提升是另外一個(gè)說法了,所以建議學(xué)習(xí)EventBus 3.0。
注解
新增的@Subscribe
threadMode =ThreadMode.MainThread
用注解的方式代替約定的方法名規(guī)范,是其最大的改變。在2.4中,你可能需要這么定義:
publicvoidonEventMainThread(MessageEventevent) {
log(event.message);
}
該方法為接收消息后在主線程中處理事件,而在3.0中:
@Subscribe(threadMode =
ThreadMode.MainThread)//在ui線程執(zhí)行
publicvoidonUserEvent(UserEventevent) {
log(event.message);
}
其中ThreadMode提供了四個(gè)常量:
·MainThread主線程
·BackgroundThread后臺(tái)線程
·Async后臺(tái)線程
·PostThread發(fā)送線程(默認(rèn))
BackgroundThread:當(dāng)事件是在UI線程發(fā)出,那么事件處理實(shí)際上是需要新建單獨(dú)線程,如果是在后臺(tái)線程發(fā)出,那么事件處理就在該線程。該事件處理方法應(yīng)該是快速的,避免阻塞后臺(tái)線程。
Async:發(fā)送事件方不需要等待事件處理完畢。這種方式適用于該事件處理方法需要較長(zhǎng)時(shí)間,例如網(wǎng)絡(luò)請(qǐng)求。
sticky = true
默認(rèn)情況下,其為false。什么情況下使用sticky呢?
相信大多數(shù)使用過EventBus 2.4的同學(xué)或多或少的使用過:
EventBus.getDefault().postSticky(newVoteEvent(obj));
EventBus.getDefault().registerSticky(this);
你會(huì)發(fā)現(xiàn)非常的麻煩,那么在3.0中:
EventBus.getDefault().postSticky(newVoteEvent(obj));
EventBus.getDefault().register(this);
@Subscribe(sticky = true)
什么時(shí)候使用sticy,當(dāng)你希望你的事件不被馬上處理的時(shí)候,舉個(gè)栗子,比如說,在一個(gè)詳情頁(yè)點(diǎn)贊之后,產(chǎn)生一個(gè)VoteEvent,VoteEvent并不立即被消費(fèi),而是等用戶退出詳情頁(yè)回到商品列表之后,接收到該事件,然后刷新Adapter等。其實(shí)這就是之前我們用startActivityForResult和onActivityResult做的事情。
priority = 1
相信大部分人知道該用法,值越小優(yōu)先級(jí)越低,默認(rèn)為0。
建議
推薦大家在使用EventBus的時(shí)候,創(chuàng)建一個(gè)事件類,把你的每一個(gè)參數(shù)(或者可能發(fā)生沖突的參數(shù)),封裝成一個(gè)類:
publicclassEvent{
publicstaticclassUserListEvent{
publicListusers ;
}
publicstaticclassItemListEvent{
publicListitems;
}
}
添加processor
按照Markus Junginger的說法(EventBus創(chuàng)作者),在3.0中,如果你想進(jìn)一步提升你的app的性能,你需要添加:
provided'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
其在編譯的時(shí)候?yàn)樽?cè)類構(gòu)建了一個(gè)索引,而不是在運(yùn)行時(shí),這樣的結(jié)果是其讓EventBus 3.0的性能提升了一倍,相比2.4來說,其會(huì)是它的3到6倍。大家可以感受下:
