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数组,顺序下发数据源。所以之后订阅的消息都能收到。