Completable只会关心onComplete和onError事件,要么成功要么失败,不会发送事件
Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
emitter.onComplete();
}
}).subscribe(new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
});
看看Completable是什么
public abstract class Completable implements CompletableSource
public interface CompletableSource {
void subscribe(@NonNull CompletableObserver co);
}
public interface CompletableObserver {
void onSubscribe(@NonNull Disposable d);
void onComplete();
void onError(@NonNull Throwable e);
}
调用 subscribe
public final Disposable subscribe(final Action onComplete) {
...
CallbackCompletableObserver observer = new CallbackCompletableObserver(onComplete);
subscribe(observer);
return observer;
}
调用 create
public static Completable create(CompletableOnSubscribe source) {
...
return RxJavaPlugins.onAssembly(new CompletableCreate(source));
}
继续查看CompletableCreate
public final class CompletableCreate extends Completable {
final CompletableOnSubscribe source;
public CompletableCreate(CompletableOnSubscribe source) {
this.source = source;
}
@Override
protected void subscribeActual(CompletableObserver observer) {
Emitter parent = new Emitter(observer);
observer.onSubscribe(parent);
try {
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
随着source.subscribe(parent);的调用,进入我们的
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
emitter.onComplete();
}
public void onComplete() {
if (get() != DisposableHelper.DISPOSED) {
Disposable d = getAndSet(DisposableHelper.DISPOSED);
if (d != DisposableHelper.DISPOSED) {
try {
downstream.onComplete();
} finally {
if (d != null) {
d.dispose();
}
}
}
}
}
onComplete 调用后,就会调用dispose,这样就不会调用到 downstream.onError(t);了
public boolean tryOnError(Throwable t) {
if (t == null) {
t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
}
if (get() != DisposableHelper.DISPOSED) {
Disposable d = getAndSet(DisposableHelper.DISPOSED);
if (d != DisposableHelper.DISPOSED) {
try {
downstream.onError(t);
} finally {
if (d != null) {
d.dispose();
}
}
return true;
}
}
return false;
}
基于源码2.2.4版本