RxJava2ソースコード分析ノート(1)

RxJava2ソースコード分析ノート(2)

RxJava2ソースコード分析ノート(3)スレッドの切り替え

最も単純な呼び出しを見てみましょう

Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws Exception {
                System.out.println(" 被观察者 subscribe  ");
                emitter.onNext("onNext");

               //  onError 和 onComple 其中一个被调用就代表结束
               //  另一个不会被调用,下面源码中会分析
                emitter.onError(new NullPointerException());
                emitter.onComplete();

            }
        }).subscribe(new Observer<Object>() {
            @Override
            public void onComplete() {
                System.out.println(" onComplete  ");
            }

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

            @Override
            public void onNext(@NonNull Object object) {
                System.out.println(" onNext  ");
            }

            @Override
            public void onSubscribe(@NonNull Disposable d) {
                // 此方法是第一个被回调的,在其他回调方法之前
                System.out.println(" 观察者onSubscribe  ");
            }
        }); 

ログの印刷(ログでonErrorが実行された後、onCompleteがログを出力しないことがわかります)

 

上記は単にオブザーバーを作成し、コールバックを受信するためにサブスクライバーを登録することです。

 Observable.create(ビューア).subscribe(ビューア);

1 Observable.createを最初に見てください(observed

    @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
        ObjectHelper.requireNonNull(source, "source is null");

        //省略其他代码,只留主要代码
        return  new ObservableCreate<T>(source);
    }

    ↓
    ↓
    ↓     ObservableCreateを見
    ↓
    ↓

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);
        }
    }

    //...后面先省略
    //...

Observable.createはここにあり、Observableを継承するObservableCreateオブジェクトを取得します。Observableの抽象メソッドsubscribeActualが実装されています。

2もう一度見てください。subscribe(observer);

    @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
            observer = RxJavaPlugins.onSubscribe(this, observer);

            ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");

            //观察者对象被subscribe进来以后执行了这个方法
            subscribeActual(observer);

        } catch (NullPointerException e) { // NOPMD
            throw e;
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            // can't call onError because no way to know if a Disposable has been set or not
            // can't call onSubscribe because the call might have set a Subscription already
            RxJavaPlugins.onError(e);

            NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
            npe.initCause(e);
            throw npe;
        }
    }

次に、subscribeActual(observer);が見つかりましたをクリックします。

protected abstract void subscribeActual(Observer<? super T> observer);

特定の実装がObservable.create(observable);に実装されているため、これが抽象メソッドである理由は、上記のObservable.create observed)によって取得されたObservableCreateオブジェクトに戻り、subscribeActualメソッドがどのように実装されているかを確認します。

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) {
                                  // 1 subscribe方法传进的观察者被传到了这里

        // 2 Emitter是发射,发射器的意思,就是发射数据用的;并将subscribe方法传进的观察者
        //   传到这个发射器里面
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);

        // 3 此处就是执行subscribe方法中观察者的onSubscribe方法,所以会先打印这个日志
        observer.onSubscribe(parent);

        try {
            // 4 这个source就是create的时候传进的被观察者,执行subscribe方法
            source.subscribe(parent);

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

上の図では、4 source.subscribe(parent);が実際に実行されます。

 Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws 
              Exception {
                 System.out.println(" 被观察者 subscribe  ");
                emitter.onNext("onNext");

                //  onError 和 onComple 其中一个被调用就代表结束
                //  另一个不会被调用,下面源码中会分析
                emitter.onError(new NullPointerException());
                emitter.onComplete();
                
            }
        }
而emitter接着就会执行 onNext....及后面的方法。emitter其实就是上上图中2 

CreateEmitter<T> parent = new CreateEmitter<T>(observer);

クリックしてご覧ください

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);
        }
    } 
    //CreateEmitter 是ObservableCreate中的一个内部类
    static final class CreateEmitter<T>
    extends AtomicReference<Disposable>
    implements ObservableEmitter<T>, Disposable {


        private static final long serialVersionUID = -3434801548987643227L;

        final Observer<? super T> observer;
        
        //接收到subscribe传进来的观察者赋值给全局observer
        //后面就是使用它调用onNext,onError,onComplete方法
        CreateEmitter(Observer<? super T> observer) {
            this.observer = observer;
        }

        @Override
        public void onNext(T t) {
            

            if (!isDisposed()) {
                //这里执行其实就是调用subscribe绑定的观察者的onNext   
                observer.onNext(t);
            }
        }

        @Override
        public void onError(Throwable t) {
            if (!tryOnError(t)) {
                RxJavaPlugins.onError(t);
            }
        }

        @Override
        public boolean tryOnError(Throwable t) {
           
            if (!isDisposed()) {
                try {
                     //这里执行其实就是调用subscribe绑定的观察者的onError
                    observer.onError(t);
                } finally {
                    dispose();
                }
                return true;
            }
            return false;
        }

        @Override
        public void onComplete() {
            if (!isDisposed()) {
                try {
                   //这里执行其实就是调用subscribe绑定的观察者的onComplete
                    observer.onComplete();
                } finally {
                    dispose();
                }
            }
        }

    //其他省略
}

このような完全なコールバックは機能します。

総括する:

 

加えて:

その中で、onCompleteとonErrorを実行すると、dispose()メソッド内でfinallyが実行され、判断を実行する前にif(!isDisposed())、

一方が実行されると、disposeの状態が変更されるため、もう一方は実行されません。

このように、onCompleteとoneErrorは、どちらか一方のみを実行し、両方は実行しません。

       @Override
        public void onError(Throwable t) {
            if (!tryOnError(t)) {
                RxJavaPlugins.onError(t);
            }
        }

        @Override
        public boolean tryOnError(Throwable t) {
            
            if (!isDisposed()) {
                try {
                    observer.onError(t);
                } finally {
                    dispose();
                }
                return true;
            }
            return false;
        }

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

 

 

 

おすすめ

転載: blog.csdn.net/u011288271/article/details/107952881