給EventBus發的消息加個id來區分

背景

在小型的項目當中,接入EventBus不失爲一種好的解耦方式,同時也很好的避免了多餘的接口代碼的編寫,發送方只管將消息發出,而不用去管對應消息類型的接收方怎麼處理。java

然而,在使用過程當中,也不免趕上了一些很差用的特性。android

EventBus能夠經過@Subscribe註解來聲明接收方方法。發送方和接收方的對應是經過發送的數據的類來作的。git

發送方發送一個String類型的消息,那麼在註冊了的訂閱者中,被@Subscribe註解的全部String參數和Object參數的方法都是能夠收到這個消息的。github

一方面,這樣致使了發送者和接收者的關係不夠直觀,另外一方面,若是真要傳遞String類型,卻不想被訂閱者的某些String參數方法收到,是沒法作到的。因此,在參數類型來分配接收者的基礎下,我認爲還須要加一個維度來區分消息。bash

改進

基於EventBus開源的3.0.0的代碼,我對其作出適當修改,給@Subscribe註解增長了一個int類型的id屬性,同時給EventBus類重載了post(int,Object)方法,使得接收方能夠這樣註解本身的方法:maven

@Subscribe(id = 1)
public void print(String message){
    Log.i("tag",message);
}

@Subscribe(id = 2)
public void setMessage(String message){
    this.mMessage = message;
}複製代碼

而後發送方能夠這樣發送本身的消息:ide

EventBus.getDefault().post(1,"hello world!");複製代碼

這樣,儘管接收String類型的方法有兩個,可是因爲發送的消息id是1,因此,只有print方法會收到消息並執行。post

固然,EventBus原汁原味的不加id的方式也是保留的,你能夠不給接收放指定id,也不在發送的時候使用id參數,這樣依舊是全部同參數類型的接收者都會執行。以下。gradle

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    EventBus.getDefault().post("hello world");
}

@Subscribe
public void print(String message){
    Log.i("tag",message);
}複製代碼

使用

先放GitHub源碼連接ui

1. 添加JitPack倉庫連接到根項目的build.gradle:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}複製代碼

2. 在module的build.gradle中添加依賴

dependencies {
    implementation 'com.github.lizhengxian1991.eventbusplus:eventbus:1.0.0'
    annotationProcessor 'com.github.lizhengxian1991.eventbusplus:eventbus-annotation-processor:1.0.0'
}複製代碼

3. 在module的build.gradle中增長Processor參數,指定生成的Eventbus的索引類名(替換<Your index class name>

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : '<Your index class name>' ]
            }
        }
    }
}複製代碼

4. 在Application的onCreate方法中初始化索引(將`<Your index class name>替換爲3中定義的類)

EventBus.builder().addIndex(new <Your index class name>()).installDefaultEventBus();複製代碼

其餘使用方式同原版EventBus 3.0.0版本一致,經過EventBus.getDefault().register(subscriber)來註冊消息接收者對象,而後就能夠盡情的post和subscribe啦!

相關文章
相關標籤/搜索