EventBus3.0新特性之Subscriber Index

Subscriber Index(訂閱者索引)是一個(gè)可選擇的優(yōu)化技術(shù)核偿,用來加速初始化subscriber注冊。

利用反射來讀取訂閱類中的訂閱方法信息

通過使用EventBus annotation processor(EventBus注解處理器)署穗,訂閱者索引在編譯期間就會被創(chuàng)建庞瘸。雖然沒有規(guī)定必須使用它端衰,但是由于它在Android中最佳性能坎炼,官方推薦使用此方式。

使用索引的先決條件

注意只有用@Subscriber注解的方法才能被編入索引到禁舷,同時(shí)subscriber類和事件類必須是public彪杉。并且,由于Java注解處理本身的技術(shù)限制牵咙,@Subscribe 注解不能使用在匿名類中派近。

當(dāng)EventBus不能使用索引,它將自動恢復(fù)到在運(yùn)行時(shí)通過反射的方式霜大,因此它也能正常工作构哺,只是變得更慢了。

怎么生成索引战坤?

使用注解處理器

如果你不是使用 Android Gradle Plugin version 2.2.0 或更高版本,請以android-apt方式來配置残拐。

啟用索引生成功能途茫,你需要使用annotationProcessor 屬性把EventBus注解處理器添加到你的build。另外溪食,設(shè)置一個(gè)eventBusIndex參數(shù)去指定你想要產(chǎn)生索引類的全路徑類名囊卜。比如說,添加下面的部分到你的Gradle build 腳本。

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'
}

我自己試過不行栅组,不知道為什么雀瓢?

使用android-apt

打開App的build.gradle,在dependencies中添加最新的EventBus依賴:

compile 'org.greenrobot:eventbus:3.0.0'

在項(xiàng)目gradle的dependencies中引入apt編譯插件:

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

然后在App的build.gradle中應(yīng)用apt插件玉掸,并設(shè)置apt生成的索引的包名和類名:

apply plugin: 'com.neenbedankt.android-apt'
apt {
    arguments {
        eventBusIndex "com.study.sangerzhong.studyapp.MyEventBusIndex"
    }
}

接著在App的dependencies中引入EventBusAnnotationProcessor:

apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'

在Rebuild Project操作前刃麸,確保有@Subscribe注解的方法,否則不會生成索引類司浪。 Rebuild Project后泊业,就會發(fā)現(xiàn)在\ProjectName\app\build\generated\source\apt\PakageName\ 下看到通過注解處理器生成的索引類,這樣我們便可以在初始化EventBus時(shí)應(yīng)用我們生成的索引了啊易。

在這里會生成類名為MyEventBusIndex的索引類:

/** This class is generated by EventBus, do not edit. */
public class MyEventBusIndex implements SubscriberInfoIndex {
    private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;

    static {
        SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>();

        putIndex(new SimpleSubscriberInfo(MainActivity.class, true, new SubscriberMethodInfo[] {
            new SubscriberMethodInfo("onEventA", PayEvent.class, ThreadMode.ASYNC),
        }));

        putIndex(new SimpleSubscriberInfo(MyIntentService.class, true, new SubscriberMethodInfo[] {
            new SubscriberMethodInfo("onEventBB", PayEvent.class),
        }));

    }

    private static void putIndex(SubscriberInfo info) {
        SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info);
    }

    @Override
    public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
        SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
        if (info != null) {
            return info;
        } else {
            return null;
        }
    }
}

可以看出是使用一個(gè)靜態(tài)HashMap來保存訂閱類的相關(guān)信息吁伺,其中包括了訂閱類的class對象,是否需要檢查父類,以及所有事件響應(yīng)函數(shù)的信息租谈。

怎么把索引類應(yīng)用到Android?

當(dāng)你實(shí)例化EventBus時(shí)篮奄,通過以下方式:

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

或者,你想要在整個(gè)app中使用設(shè)置了索引類的EventBus實(shí)例作為默認(rèn)單例割去。

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

對比通過編譯時(shí)反射方式

在3.0版本中窟却,EventBus提供了一個(gè)EventBusAnnotationProcessor注解處理器來在編譯期通過讀取@Subscribe注解,并解析和處理其中所包含的信息劫拗,然后生成java類來保存訂閱者中所有的事件響應(yīng)函數(shù)间校,這樣就比在運(yùn)行時(shí)使用反射來獲得訂閱者中所有事件響應(yīng)函數(shù)的速度要快。

參考

http://greenrobot.org/eventbus/documentation/subscriber-index/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末页慷,一起剝皮案震驚了整個(gè)濱河市憔足,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酒繁,老刑警劉巖滓彰,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異州袒,居然都是意外死亡揭绑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門郎哭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來他匪,“玉大人,你說我怎么就攤上這事夸研“蠲郏” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵亥至,是天一觀的道長悼沈。 經(jīng)常有香客問我贱迟,道長,這世上最難降的妖魔是什么絮供? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任衣吠,我火速辦了婚禮,結(jié)果婚禮上壤靶,老公的妹妹穿的比我還像新娘缚俏。我一直安慰自己,他們只是感情好萍肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布袍榆。 她就那樣靜靜地躺著,像睡著了一般塘揣。 火紅的嫁衣襯著肌膚如雪包雀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天亲铡,我揣著相機(jī)與錄音才写,去河邊找鬼。 笑死奖蔓,一個(gè)胖子當(dāng)著我的面吹牛赞草,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吆鹤,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼厨疙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疑务?” 一聲冷哼從身側(cè)響起沾凄,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎知允,沒想到半個(gè)月后撒蟀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温鸽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年保屯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涤垫。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姑尺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝠猬,到底是詐尸還是另有隱情股缸,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布吱雏,位于F島的核電站敦姻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏歧杏。R本人自食惡果不足惜镰惦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犬绒。 院中可真熱鬧旺入,春花似錦、人聲如沸凯力。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐鹤。三九已至拗秘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祈惶,已是汗流浹背雕旨。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捧请,地道東北人凡涩。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像疹蛉,于是被迫代替她去往敵國和親活箕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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

  • 對于Android開發(fā)老司機(jī)來說肯定不會陌生可款,它是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架育韩,開發(fā)者可以通過極少的代碼...
    飛揚(yáng)小米閱讀 1,480評論 0 50
  • 項(xiàng)目到了一定階段會出現(xiàn)一種甜蜜的負(fù)擔(dān):業(yè)務(wù)的不斷發(fā)展與人員的流動性越來越大,代碼維護(hù)與測試回歸流程越來越繁瑣筑舅。這個(gè)...
    fdacc6a1e764閱讀 3,189評論 0 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,307評論 25 707
  • “Some Interesting Open Source Projects of Android”這個(gè)系列主要是...
    Burjal閱讀 2,591評論 2 10
  • 這一天翠拣,我們遇見 “人生總有一個(gè)鏡頭叫遇見版仔,人生總有一個(gè)情節(jié)叫相戀,人生就如一場戲误墓,你就是我戲里面的主角蛮粮。” 也許...
    宮子say閱讀 252評論 0 0