EventBus源碼---索引優化的使用

搞了4個小時左右,終於把EventBus的索引優化弄明白了。這裏的明白是知道怎麼使用了,源碼的話,我們下篇文章來說。所以這篇文章我們僅從使用上面來說索引優化。有的同學可能會說,使用嘛,即便是沒用過,百度一下也就OK了。以下兩點,是我要寫這篇博客的原因:

(1)我問了我身邊做Android開發的朋友,他們使用EventBus都沒有使用過索引優化,不使用索引優化也沒有感覺EventBus慢。既然這樣,誰還會去理這個索引優化呢?所以,大家好像都不怎麼關心索引優化。我們要想技術上高人一等,就要知道別人所不知道的一些東西

(2)網上的確有些博客,但是對於這個索引優化說的都不是很清楚。

對於索引優化,我之前一直混淆了兩個東西:索引和APT。我一直以爲EventBus的索引優化就是使用了APT技術,所以一直帶着這個想法去看博客和做測試,結果可想而知,自己糊塗了。那真正的情況是什麼呢?其實索引優化就是索引優化,它有兩種實現方式:手動設置索引和自動設置索引。自動設置索引其實才是使用APT技術實現的。而網上一些索引優化的博客,一些是手動實現的,一些是使用APT技術實現的,所以這是我糊塗的真正原因。

既然有兩種實現方式,那我們就一種一種的來說。

一、自動設置索引(APT)

自動設置索引的方式應該比手動設置所以更常用,畢竟代碼是APT來自動生成的,實現的代碼比較少;其次,對於EventBus的使用和不使用索引沒有什麼區別。

首先在項目build.gradle中添加一下代碼:

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

然後再module的build.gradle添加:

android {
    ...

    defaultConfig {
        ...

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [eventBusIndex : 'com.gzc.mytest.MyEventBusIndex']
            }
        }
    }

    ....
}

dependencies {
    ....
    //我這裏直接使用的EventBus的源碼module,可以換成相應的依賴地址
    implementation project(path: ':eventbus')
    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.2.0'
}

1.在defaultConfig中的代碼作用是APT生成的文件名稱及路徑

2.dependencies中不要忘了添加上anotationProcessor這句代碼

之後,我們需要在Application文件中進行索引的設置

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.builder()
                .addIndex(new MyEventBusIndex())
                .installDefaultEventBus();
    }
}

addIndex中的類就是我們在build.gradle中所設置APT生成的類;而installDefaultEventBus則是重新設置了EventBus中的defaultInstance

之後該做什麼了呢?其實就是EventBus的正常使用了,進行註冊,post,添加註解等常規操作了。自動生成索引到這裏就結束了。

二、手動設置索引

其實手動設置索引比自動的方式要稍微複雜一點點,不如自動設置索引方便。因爲不使用APT,索引不要在項目和module的build.gradle進行特殊的設置。我們只需要去寫索引文件就行。索引文件如何寫呢?我們看下面的例子

public class ManualEventBusIndex implements SubscriberInfoIndex {
    @Override
    public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
        SubscriberMethodInfo[] infos = new SubscriberMethodInfo[] {
                new SubscriberMethodInfo("test", TestBean.class, ThreadMode.MAIN),
        };
        return new SimpleSubscriberInfo(subscriberClass,true,infos);
    }
}

1.首先,這個索引文件需要實現SubscriberInfoIndex接口,實現getSubscriberInfo方法

2.在方法中創建SubscriberMethodInfo數組,從這個類名我們可以猜測,主要是註冊者的方法信息,我們從上面的例子中得知:SubscriberMethodInfo構造方法有三個參數(其實有多個構造方法,小夥伴可以自行查看):第一個參數是註冊者中接收事件方法;第二參數是接收事件的類型;第三個參數是接收事件的線程。總之,在@Subscribe註解中的屬性,SubscriberMethodInfo的構造方法都能體現出來。

3.最後返回了SimpleSubscriberInfo這個類。並且添加了三個參數:註冊類,是否進行父類檢查,還有剛剛所說的數組。需要注意的是,第一個參數一定要寫getSubscriberinfo方法的參數subscriberClass,不要自己填寫註冊的類,自己就在這裏踩過坑。

然後我們在Application中進行設置

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        EventBus.builder()
                .addIndex(new ManualEventBusIndex())
                .installDefaultEventBus();
    }
}

手動進行索引設置有一個好處就是,不需要再進行設置@Subscribe註解的設置了。對於手動寫索引文件,我們其實可以參照自動設置索引時生成的索引文件來寫。當然,你都自動生成索引文件了,幹嘛還要手寫呢,哈哈。

好了,關於索引優化的使用,到這裏就結束了,有問題歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章