背景
在小型的項(xiàng)目當(dāng)中脐彩,接入EventBus不失為一種好的解耦方式惋鹅,同時(shí)也很好的避免了多余的接口代碼的編寫,發(fā)送方只管將消息發(fā)出悔据,而不用去管對應(yīng)消息類型的接收方怎么處理庄敛。
然而,在使用過程中科汗,也難免遇上了一些不好用的特性藻烤。
EventBus可以通過@Subscribe注解來聲明接收方方法。發(fā)送方和接收方的對應(yīng)是通過發(fā)送的數(shù)據(jù)的類來做的头滔。
發(fā)送方發(fā)送一個(gè)String類型的消息怖亭,那么在注冊了的訂閱者中,被@Subscribe注解的所有String參數(shù)和Object參數(shù)的方法都是可以收到這個(gè)消息的坤检。
一方面兴猩,這樣導(dǎo)致了發(fā)送者和接收者的關(guān)系不夠直觀,另一方面早歇,如果真要傳遞String類型倾芝,卻不想被訂閱者的某些String參數(shù)方法收到,是無法做到的箭跳。所以晨另,在參數(shù)類型來分配接收者的基礎(chǔ)下,我認(rèn)為還需要加一個(gè)維度來區(qū)分消息谱姓。
改進(jìn)
基于EventBus開源的3.0.0的代碼借尿,我對其做出適當(dāng)修改,給@Subscribe注解增加了一個(gè)int類型的id屬性,同時(shí)給EventBus類重載了post(int,Object)方法路翻,使得接收方可以這樣注解自己的方法:
@Subscribe(id = 1)
public void print(String message){
Log.i("tag",message);
}
@Subscribe(id = 2)
public void setMessage(String message){
this.mMessage = message;
}
然后發(fā)送方可以這樣發(fā)送自己的消息:
EventBus.getDefault().post(1,"hello world!");
這樣狈癞,盡管接收String類型的方法有兩個(gè),但是由于發(fā)送的消息id是1帚桩,所以亿驾,只有print方法會(huì)收到消息并執(zhí)行嘹黔。
當(dāng)然账嚎,EventBus原汁原味的不加id的方式也是保留的,你可以不給接收放指定id儡蔓,也不在發(fā)送的時(shí)候使用id參數(shù)郭蕉,這樣依舊是所有同參數(shù)類型的接收者都會(huì)執(zhí)行。如下喂江。
...
@Override
protected void onCreate(Bundle savedInstanceState) {
EventBus.getDefault().post("hello world");
}
@Subscribe
public void print(String message){
Log.i("tag",message);
}
使用
先放GitHub源碼鏈接召锈。
1. 添加JitPack倉庫鏈接到根項(xiàng)目的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參數(shù),指定生成的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啦!