吐槽
必須吐槽下啊,一直以為 RxBus 是像 EventBus 一樣是1個開源庫呢,誰知道壓根不是這么回事啊,RxBus 只是一個思路:用 rxjava 來實(shí)現(xiàn)一個 EventBus ,沒有規(guī)范,標(biāo)準(zhǔn)的開源庫,需要我們自己去寫,不過好在這么久過去了,有一些大家都認(rèn)可的寫法,這里不是我的原創(chuàng),我也是看別人的,總結(jié)下,代碼不手寫出來就永遠(yuǎn)不是你的。
開工
其實(shí)思路很簡單的,EventBus 怎么設(shè)計咱就怎么設(shè)計。在 rxjava 中用到了 subject 用來進(jìn)行熱發(fā)射和 ofType 操作符
- 熱發(fā)射不熟悉的朋友可以看我的文章:我學(xué) rxjava 2(3)- 熱發(fā)射
- ofType 操作符是filter + cast的組合,只發(fā)送特定的類型。fliter用來判斷是否為指定的類型,cast將一個Observable轉(zhuǎn)換為指定的特殊Observable
就這些了,其他的都算是代碼封裝中最簡單的,單例模式。
代碼
這是簡單的不能再簡單了,我就不特別去說了,大家自己領(lǐng)會
package com.bloodcrown.rxbus;
import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;
import io.reactivex.subjects.Subject;
/**
* 作者 : BloodCrown
* 時間 : 2018/4/25 下午1:00
* 描述 :
*/
public class RxBus {
public static volatile RxBus instance;
private Subject<Object> bus;
private RxBus() {
bus = PublishSubject.create().toSerialized();
}
public static RxBus getInstance() {
if (instance == null) {
synchronized (RxBus.class) {
if (instance == null) {
instance = new RxBus();
}
}
}
return instance;
}
public void post(Object message) {
bus.onNext(message);
}
public <T> Observable<T> setTag(Class<T> type) {
return bus.ofType(type);
}
public boolean hasObserver() {
return bus.hasObservers();
}
}
使用頁很簡單,分步說一下
- 前置
管理 rxjava 管道對象
private CompositeDisposable disposables;
- 注冊
catDisposable = RxBus.getInstance()
.setTag(new Cat().getClass())
.subscribe(new Consumer<Cat>() {
@Override
public void accept(Cat cat) throws Exception {
Toast.makeText(context, "數(shù)據(jù)2收到", Toast.LENGTH_SHORT).show();
}
});
disposables.add(catDisposable);
- 解綁
if (bookDisposable != null && !bookDisposable.isDisposed()) {
bookDisposable.dispose();
}
效果演示:
效果演示
好了,就這么多,看著很簡單,大家手寫一遍才真的行啊,練手很不錯的,寫完很有成就感
最后是本篇文章 demo:BW_RxBus