Rxjava2 Completable

394 阅读1分钟

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版本