1、单例参考写法:
public static RxBus getRxBus() {
if (rxBus == null) {
synchronized (RxBus.class) {
if(rxBus == null) {
rxBus = new RxBus();
}
}
}
return rxBus;
}
2、Subject 的实现类
- AsyncSubject:只有当 Subject 调用 onComplete 方法时,才会将 Subject 中的最后一个事件传递给所有的 Observer。
- BehaviorSubject:当一个 Observer 使用了 subscribe() 方法对其进行订阅的时候,它只能收到在订阅之前发送出的最后一个结果(或者说最新的值),在这之前的结果是无法被接收到的。
- PublishSubject:在已经发送了一部分事件之后注册的 Observer 不会收到之前发送的事件。
- ReplaySubject:无论什么时候注册 Observer 都可以接收到任何时候通过该 Observable 发射的事件。
3、用Subjec代替eventBus发送事件
/**
* 用RXJava代替eventBus发送事件
*/
public class RXBus {
private static volatile RXBus sRXBus;
private final Subject<Object> mSubject = PublishSubject.create().toSerialized();
private final Map<String, CompositeDisposable> mDisposableMap = new HashMap<>();
public static RXBus getRXBus() {
if (sRXBus == null) {
synchronized (RXBus.class) {
if (sRXBus == null) {
sRXBus = new RXBus();
}
}
}
return sRXBus;
}
private <T> Flowable<T> getObservable(Class<T> type) {
return mSubject.toFlowable(BackpressureStrategy.BUFFER).ofType(type);
}
public void addSubscription(Object tag, Disposable disposable) {
String key = String.valueOf(tag.hashCode());
if (mDisposableMap.get(key) != null) {
mDisposableMap.get(key).add(disposable);
} else {
CompositeDisposable disposables = new CompositeDisposable();
disposables.add(disposable);
mDisposableMap.put(key, disposables);
}
}
public void unSubscribe(Object tag) {
String key = String.valueOf(tag.hashCode());
if (!mDisposableMap.containsKey(key)) {
return;
}
if (mDisposableMap.get(key) != null) {
mDisposableMap.get(key).dispose();
}
mDisposableMap.remove(key);
}
public void post(Object content) {
mSubject.onNext(content);
}
public <T> Disposable doSubscribe(Class<T> type, Consumer<T> next, Consumer<Throwable> error) {
return getObservable(type)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(next, error);
}
}
4、调用方法封装
protected void postEvent(Object content) {
RXBus.getRXBus().post(content);
}
protected void unSubscribe(Object tag) {
RXBus.getRXBus().unSubscribe(tag);
}
protected <M> void addSubscription(Object tag, Class<M> eventType, Consumer<M> action) {
Disposable disposable = RXBus.getRXBus()
.doSubscribe(eventType, action, Functions.<Throwable>emptyConsumer());
RXBus.getRXBus().addSubscription(tag, disposable);
}
protected <M> void addSubscription(Object tag, Class<M> eventType, Consumer<M> action, Consumer<Throwable> error) {
Disposable disposable = RXBus.getRXBus()
.doSubscribe(eventType, action, error);
RXBus.getRXBus().addSubscription(tag, disposable);
}
5、测试代码
addSubscription(this, String.class, new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
textView.setText(s);
}
});
postEvent("hhhoooooo");
参考文章:https://juejin.im/post/5b801dfa51882542cb409905、https://www.jianshu.com/p/1257c8ba7c0c