Rxjava2 Maybe

405 阅读1分钟
Maybe.create(new MaybeOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NotNull MaybeEmitter<Integer> emitter) throws Exception {
                emitter.onSuccess(1); //可以发送到下游
                emitter.onSuccess(2); //不会发送到下游
                emitter.onComplete(); //不会发送到下游
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.out.println(throwable.getMessage());
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("onComplete");
            }
        });

Maybe可以发送事件,要么onSuccess,要么onError,要么onComplete,三个只会执行一个。 下面看看源码是怎么做到的

   public static <T> Maybe<T> create(MaybeOnSubscribe<T> onSubscribe) {
        ObjectHelper.requireNonNull(onSubscribe, "onSubscribe is null");
        return RxJavaPlugins.onAssembly(new MaybeCreate<T>(onSubscribe));
    }

create方法创建一个MaybeCreate类,

public final class MaybeCreate<T> extends Maybe<T> {

    final MaybeOnSubscribe<T> source;

    public MaybeCreate(MaybeOnSubscribe<T> source) {
        this.source = source;
    }
    ...

调用subscribe

  public final Disposable subscribe(Consumer<? super T> onSuccess, Consumer<? super Throwable> onError,
            Action onComplete) {
         ...
        return subscribeWith(new MaybeCallbackObserver<T>(onSuccess, onError, onComplete));
    }
public final class MaybeCallbackObserver<T> extends AtomicReference<Disposable>
implements MaybeObserver<T>, Disposable, LambdaConsumerIntrospection {

    private static final long serialVersionUID = -6076952298809384986L;

    final Consumer<? super T> onSuccess;

    final Consumer<? super Throwable> onError;

    final Action onComplete;

    public MaybeCallbackObserver(Consumer<? super T> onSuccess, Consumer<? super Throwable> onError,
            Action onComplete) {
        super();
        this.onSuccess = onSuccess;
        this.onError = onError;
        this.onComplete = onComplete;
    }
    ....
}

回到MaybeCreate

public final class MaybeCreate<T> extends Maybe<T> {

    final MaybeOnSubscribe<T> source;

    public MaybeCreate(MaybeOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(MaybeObserver<? super T> observer) {
        Emitter<T> parent = new Emitter<T>(observer);
        observer.onSubscribe(parent);

        try {
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }
    ...

里面的observer就是MaybeCallbackObserver对象 source.subscribe(parent); 这个参数parent就是我们的emitter。 好了,现在我们可以调用emitter发送我们希望的事件了。 比如发送

  emitter.onSuccess(1); //可以发送到下游
 static final class Emitter<T>  extends AtomicReference<Disposable>
    implements MaybeEmitter<T>, Disposable {

      ....

        @Override
        public void onSuccess(T value) {
            if (get() != DisposableHelper.DISPOSED) {
                Disposable d = getAndSet(DisposableHelper.DISPOSED);
                if (d != DisposableHelper.DISPOSED) {
                    try {
                        if (value == null) {
                            downstream.onError(new NullPointerException("onSuccess called with null. Null values are generally not allowed in 2.x operators and sources."));
                        } else {
                            downstream.onSuccess(value);
                        }
                    } finally {
                        if (d != null) {
                            d.dispose();
                        }
                    }
                }
            }
        }

onSuccess经过重重验证,后调用 downstream.onSuccess(value);, 最后dispose事件,接下来的onComplete也没机会执行了。onError也是一样。

 @Override
        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();
                        }
                    }
                }
            }
        }

基于源码2.2.4版本