doOnComplete操作符的作用是在调用onComplete后执行。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NotNull ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onComplete();
}
}).doOnComplete(new Action() {
@Override
public void run() throws Exception {
System.out.println("doOnComplete");
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NotNull Disposable d) {
System.out.println("onSubscribe");
mDisposable = d;
}
@Override
public void onNext(@NotNull String s) {
System.out.println("onNext " + s);
}
@Override
public void onError(@NotNull Throwable e) {
System.out.println("onError");
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
});
输出
onSubscribe
onNext 1
doOnComplete
onComplete
看看源码
public final Observable<T> doOnComplete(Action onComplete) {
return doOnEach(Functions.emptyConsumer(), Functions.emptyConsumer(), onComplete, Functions.EMPTY_ACTION);
}
private Observable<T> doOnEach(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Action onAfterTerminate) {
...
return RxJavaPlugins.onAssembly(new ObservableDoOnEach<T>(this, onNext, onError, onComplete, onAfterTerminate));
}
当我们调用onComplete时, onComplete.run();就会执行,并且是在下游收到onComplete事件之前调用。
public void onComplete() {
...
try {
onComplete.run();
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
onError(e);
return;
}
done = true;
downstream.onComplete();
...
}