RxBus原理分析

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數組,順序下發數據源。所以之後訂閱的消息都能收到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章