Rxjava2 Observable

101 阅读1分钟

Observable可以发送多个事件,也可以发送onError,会调用onComplete

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NotNull ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NotNull Disposable d) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(@NotNull Integer integer) {
                System.out.println("onNext: " + integer);
            }

            @Override
            public void onError(@NotNull Throwable e) {
                System.out.println("onError: " + e.getMessage());
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });

看看Observable

public abstract class Observable<T> implements ObservableSource<T>
public interface ObservableSource<T> {

    void subscribe(@NonNull Observer<? super T> observer);
}
public interface Observer<T> {

    void onSubscribe(@NonNull Disposable d);

    void onNext(@NonNull T t);

    void onError(@NonNull Throwable e);

    void onComplete();

}

可以看出被观察者Observable感兴趣的Observer的方法 。

调用create,创造ObservableCreate对象。

  public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ...
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }
public final class ObservableCreate<T> extends Observable<T> {
    final ObservableOnSubscribe<T> source;

    public ObservableCreate(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

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

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

执行到 source.subscribe(parent);,就到了我们的

 public void subscribe(@NotNull ObservableEmitter<Integer> emitter) throws Exception {
     emitter.onNext(1);
     emitter.onNext(2);
     emitter.onComplete();
  }

CreateEmitterobserver调用onNext方法

 public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }

一旦调用onComplete,事件就dispose了。事件流就截止了。

 public void onComplete() {
            if (!isDisposed()) {
                try {
                    observer.onComplete();
                } finally {
                    dispose();
                }
            }
        }

基于源码2.2.4版本