EventBus 3.0 新特性

本文首發(fā):http://yuweiguocn.github.io/

本文介紹了EventBus 3.0的新特性蛔垢,新增訂閱者索引代替反射以提升性能及新加@Subscribe注解等。

《竹枝詞》
楊柳青青江水平,聞郎江上唱歌聲。
東邊日出西邊雨,道是無晴卻有晴。
-唐僵控,劉禹錫

首先,添加依賴:

compile 'org.greenrobot:eventbus:3.0.0'

訂閱事件

從EventBus 3開始鱼冀,我們需要在處理訂閱事件的方法上添加@Subscribe注解报破,方法名可以任意取悠就。我們可以使用threadMode指定分發(fā)的線程。

ThreadMode有四種充易,和以前的版本差不多:

//和post為同一線程梗脾,這也是默認的
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

//回調(diào)在Android主線程
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
  textField.setText(event.message);
}

//回調(diào)在后臺線程
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

//回調(diào)在單獨的線程
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}

粘性事件

發(fā)送Sticky和之前一樣:

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));

指定sticky參數(shù)為true,接收Sticky事件:

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

// UI updates must run on MainThread
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {   
    textField.setText(event.message);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);    
    super.onStop();
}

獲取粘性事件:

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    // "Consume" the sticky event
    EventBus.getDefault().removeStickyEvent(stickyEvent);
    // Now do something with it
}

移除粘性事件:

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    // Now do something with it
}

優(yōu)先級和取消事件

訂閱優(yōu)先級盹靴,默認為0:

@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
    ...
}

注意:不同線程模式之間的訂閱者的優(yōu)先級不受分發(fā)順序的影響炸茧。

取消事件分發(fā):

// Called in the same thread (default)
@Subscribe
public void onEvent(MessageEvent event){
    // Process the event
    ...
    // Prevent delivery to other subscribers
    EventBus.getDefault().cancelEventDelivery(event) ;
}

事件通常可以被高優(yōu)先級訂閱者取消稿静。取消事件分發(fā)的事件處理方法只能運行在ThreadMode.POSTING線程梭冠。

訂閱索引(Subscriber Index)

訂閱索引是EventBus 3的新特性,它是一個可選的優(yōu)化用于加快訂閱者注冊的初始化自赔。

我們可以通過EventBus提供的注解處理器在編譯的時候創(chuàng)建訂閱索引妈嘹。使用索引不是必須的,但為了在Android上有更好的性能推薦使用绍妨。

注意:只有添加了@Subscriber注解的訂閱者才可以被索引并且事件Event類是public的。由于Java注解處理器本身的限制柬脸,匿名內(nèi)部類中的@Subscribe注解不會被識別他去。

當(dāng)EventBus不能使用索引的時候,它會在運行時自動回退到反射模式倒堕。因此灾测,它還會正常工作,只是有點小慢垦巴。

有兩種方法可以生成索引:

1.使用annotationProcessor
如果你使用的不是Android Gradle Plugin 2.2.0 或更高版本媳搪,請使用第二種方法。
我們需要添加一個annotationProcessor屬性設(shè)置eventBusIndex參數(shù)用于指定你想生成索引的全類名骤宣。

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
            }
        }
    }
}

dependencies {
    compile 'org.greenrobot:eventbus:3.0.0'
    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}

2.使用android-apt
如果上面的不能使用秦爆,你可以使用Gradle Plugin android-apt 添加EventBus注解處理器。

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)你下次編譯的時候憔披,通過eventBusIndex指定的類會被生成等限。然后我們可以像這樣指定索引類:

EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();

或者如果你想使用默認的實例:

EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
// Now the default instance uses the given index. Use it like this:
EventBus eventBus = EventBus.getDefault();

你可以使用同樣的方法應(yīng)用到類庫中,這樣就有可能會有多個索引類芬膝,可以通過下面的方法指定多個索引類:

EventBus eventBus = EventBus.builder()
    .addIndex(new MyEventBusAppIndex())
    .addIndex(new MyEventBusLibIndex()).build();

混淆

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末望门,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锰霜,更是在濱河造成了極大的恐慌筹误,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣缅,死亡現(xiàn)場離奇詭異厨剪,居然都是意外死亡哄酝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門丽惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炫七,“玉大人,你說我怎么就攤上這事钾唬⊥蚰模” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵抡秆,是天一觀的道長奕巍。 經(jīng)常有香客問我,道長儒士,這世上最難降的妖魔是什么的止? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮着撩,結(jié)果婚禮上诅福,老公的妹妹穿的比我還像新娘。我一直安慰自己拖叙,他們只是感情好氓润,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著薯鳍,像睡著了一般咖气。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挖滤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天崩溪,我揣著相機與錄音,去河邊找鬼斩松。 笑死伶唯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砸民。 我是一名探鬼主播抵怎,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岭参!你這毒婦竟也來了反惕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤演侯,失蹤者是張志新(化名)和其女友劉穎姿染,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡悬赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年狡汉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽颇。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡盾戴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兵多,到底是詐尸還是另有隱情尖啡,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布剩膘,位于F島的核電站衅斩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怠褐。R本人自食惡果不足惜畏梆,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奈懒。 院中可真熱鬧奠涌,春花似錦、人聲如沸磷杏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茴丰。三九已至,卻和暖如春天吓,著一層夾襖步出監(jiān)牢的瞬間贿肩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工龄寞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汰规,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓物邑,卻偏偏與公主長得像溜哮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子色解,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 對于Android開發(fā)老司機來說肯定不會陌生茂嗓,它是一個基于觀察者模式的事件發(fā)布/訂閱框架,開發(fā)者可以通過極少的代碼...
    飛揚小米閱讀 1,478評論 0 50
  • 我每周會寫一篇源代碼分析的文章,以后也可能會有其他主題.如果你喜歡我寫的文章的話,歡迎關(guān)注我的新浪微博@達達達達s...
    SkyKai閱讀 24,933評論 23 184
  • 作者:Markus JungingerGithub:greenrobot/EventBus原文:老司機教你 “飆”...
    敲代碼的本愿閱讀 3,788評論 3 11
  • “Some Interesting Open Source Projects of Android”這個系列主要是...
    Burjal閱讀 2,588評論 2 10
  • 最近在項目中使用了EventBus(3.0)科阎,覺得非常好用述吸,于是就看了一些關(guān)于EventBus源碼分析的文章,現(xiàn)在...
    shenhuniurou閱讀 1,506評論 0 4