Rxjava是基於事件事件序列機制,當事件源調用onCompleted或者調用onError的時候整個事件流就代表結束了,之後在發送onNext事件是收不到的。
解決這個問題就是當接收到onError或者onCompleted事件之後重新訂閱,但是這種做法顯然不是很優雅。所以推出了Reply這個神器。
Reply
從Reply的定義可以看出來它既是一個Observable同時又是一個Consumer。由於它沒有onComplete和onError事件,所以異常不會導致下游終止狀態。
下面來分析一下RxBus的流程
RxBus 代碼如下:
public class RxBus {
public static RxBus getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final RxBus INSTANCE = new RxBus();
}
private final Relay<Object> bus = PublishRelay.create().toSerialized();
public void send(Object o) {
ReplayRelay.create();
bus.accept(o);
}
public <T> Observable<T> toObserverable(Class<T> eventType) {
return bus.ofType(eventType);
}
}
這裏主要分析 PublishRelay 這個方式(只能收到註冊以後的消息)。開始註冊一個訂閱者,代碼如下:
具體流程如下圖。
總結:Rxjava首先會形成一個鏈式結構,然後逆向訂閱。Rxbus則把逆向訂閱最後那個Observer存入一個數組裏面,當Rxbus發出消息則遍歷Observer數組,順序下發數據源。所以之後訂閱的消息都能收到。