![rb][rbsvg] ![License][licensesvg]
Download
Gradle:
implementation "com.blankj:rxbus:1.1"
How to use
非粘性事件
- 注冊事件
public class YourActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注冊 String 類型事件
RxBus.getDefault().subscribe(this, new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
Log.e("eventTag", s);
}
});
// 注冊帶 tag 為 "my tag" 的 String 類型事件
RxBus.getDefault().subscribe(this, "my tag", new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
Log.e("eventTag", s);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 注銷
RxBus.getDefault().unregister(this);
}
}
- 發(fā)送事件
// 發(fā)送 String 類型事件
RxBus.getDefault().post("without tag");
// 發(fā)送帶 tag 為 "my tag" 的 String 類型事件
RxBus.getDefault().post("with tag", "my tag");
粘性事件(也就是先發(fā)送事件容达,在之后注冊的時候便會收到之前發(fā)送的事件)
- 發(fā)送事件
// 發(fā)送 String 類型的粘性事件
RxBus.getDefault().postSticky("without tag");
// 發(fā)送帶 tag 為 "my tag" 的 String 類型的粘性事件
RxBus.getDefault().postSticky("with tag", "my tag");
- 注冊事件
public class YourActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注冊 String 類型事件
RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
Log.e("eventTag", s);
}
});
// 注冊帶 tag 為 "my tag" 的 String 類型事件
RxBus.getDefault().subscribeSticky(this, "my tag", new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
Log.e("eventTag", s);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 注銷
RxBus.getDefault().unregister(this);
}
}
Nice wrap
如果用到事件總線的地方比較多,那么可以把事件總線的使用放到一個 Manager 中使用,比如我 Demo 中做的封裝如下所示:
public class RxBusManager {
private static final String MY_TAG = "MY_TAG";
public static void subscribeRxBusManagerActivity(final RxBusManagerActivity activity){
RxBus.getDefault().subscribe(activity, new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
activity.updateText("without " + s);
}
});
RxBus.getDefault().subscribe(activity, MY_TAG, new RxBus.Callback<String>() {
@Override
public void onEvent(String s) {
activity.updateText("with " + s);
}
});
}
public static void postToRxBusManagerActivity(final String event) {
RxBus.getDefault().post(event);
}
public static void postWithMyTagToRxBusManagerActivity(final String event) {
RxBus.getDefault().post(event, MY_TAG);
}
public static void postStickyToRxBusManagerActivity(final String event) {
RxBus.getDefault().postSticky(event);
}
public static void postStickyWithMyTagToRxBusManagerActivity(final String event) {
RxBus.getDefault().postSticky(event, MY_TAG);
}
public static void unregisterRxBusManagerActivity(final RxBusManagerActivity activity) {
RxBus.getDefault().unregister(activity);
}
}
可以看出這是在 RxBusManagerActivity 中要使用 RxBus 的相關代碼尸折,這樣可以更方便地管理應用中所有的事件總線破喻,而不至于發(fā)了個事件都不清楚接收方在哪的尷尬超营。
How it comes
網上現有 RxBus 存有的問題:
- 使用的 RxBus 大多停留在 RxJava1 版本
- RxBus 實現的粘性事件很多都是有問題的
- 如果事件拋了異常协屡,之后便再也無法接收到的問題
- 同類型事件需自己再次封裝 Bean 進行區(qū)別宫蛆。
介于以上問題,我還是親自封裝一個簡潔的供大家使用栅贴,庫已經依賴了 RxAndroid 和 RxJava斟湃,所以導入了該庫的就不需要再額外導入那兩庫了。
當然檐薯,如果通信頻率比較高追求效率的話還是推薦使用 EventBus。
Principle
- 利用 FlowableProcessor 既可以作為觀察者又可以作為被觀察者來實現事件總線
- 粘性事件原理就是發(fā)送的時候把事件存到一個 hash 表中,在注冊的時候查詢下 hash 表中是否存在符合的事件坛缕,有的話就消費掉即可
- 替換原有 LambdaSubscriber 來讓拋了異常之后可以繼續(xù)接收到后續(xù)事件
- 封裝了 TagMessage 來區(qū)分不同類別的 tag
- 動態(tài)識別范型對象來省去傳入 Type 類型
還有一些細節(jié)就自己看源碼去了解吧墓猎,總共有用的代碼不超過 300 行哈。
Change log
如果正好幫到了你赚楚,那可真是巧了哈毙沾,歡迎來我的 狗窩 坐坐。