该类型的被观察者包括:doOnCompleted、doOnEach、doOnError、doOnNext、doOnTerminate。
public class OnSubscribeDoOnEach<T> implements OnSubscribe<T> {
private final Observer<? super T> doOnEachObserver;
private final Observable<T> source;
public OnSubscribeDoOnEach(Observable<T> source, Observer<? super T> doOnEachObserver) {
this.source = source;//创建当前OnSubscribeDoOnEach的Observable,即紧邻的UpStream
this.doOnEachObserver = doOnEachObserver;
}
@Override
public void call(final Subscriber<? super T> subscriber) {
//触发call回调时,优先处理其上游UpStream的回调
source.unsafeSubscribe(new DoOnEachSubscriber<T>(subscriber, doOnEachObserver));
}
private static final class DoOnEachSubscriber<T> extends Subscriber<T> {
private final Subscriber<? super T> subscriber;
private final Observer<? super T> doOnEachObserver;
private boolean done;
DoOnEachSubscriber(Subscriber<? super T> subscriber, Observer<? super T> doOnEachObserver) {
super(subscriber);
this.subscriber = subscriber;
this.doOnEachObserver = doOnEachObserver;
}
@Override
public void onCompleted() {
if (done) {
return;
}
try {
doOnEachObserver.onCompleted();
} catch (Throwable e) {
Exceptions.throwOrReport(e, this);
return;
}
// Set `done` here so that the error in `doOnEachObserver.onCompleted()` can be noticed by observer
done = true;
subscriber.onCompleted();
}
@Override
public void onError(Throwable e) {
if (done) {
RxJavaHooks.onError(e);
return;
}
done = true;
try {
doOnEachObserver.onError(e);
} catch (Throwable e2) {
Exceptions.throwIfFatal(e2);
subscriber.onError(new CompositeException(Arrays.asList(e, e2)));
return;
}
subscriber.onError(e);
}
@Override
public void onNext(T value) {
if (done) {
return;
}
try {
doOnEachObserver.onNext(value);
} catch (Throwable e) {
Exceptions.throwOrReport(e, this, value);
return;
}
subscriber.onNext(value);
}
}
}