美文网首页
RxJava:基本订阅流程

RxJava:基本订阅流程

作者: Joe_blake | 来源:发表于2018-09-23 23:00 被阅读24次

    一个简单的实例:

        //传参数url,获取gif的基础信息,并传递给下游做处理
        private Observable<Bundle> showGifDialog(String url) {
            return Observable.create(new ObservableOnSubscribe<Bundle>() {
                @Override
                public void subscribe(ObservableEmitter<Bundle> e) throws Exception {
                    e.onNext(BitmapUtils.getGifBitmapInfo(url));
                }
            }).subscribeOn(Schedulers.io());
        }
        //拿到gif信息后,展示一个自定义播放gif的Dialog
        Disposable disposable = showGifDialog(picUrl)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Bundle>() {
                    @Override
                    public void accept(Bundle bundle) throws Exception {
                        //
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        //
                    }
                });
    

    我们从Observable的创建开始,分析源码:

        public static <T> Observable<T> create(ObservableCreate<T>(source)<T> source) {
            ObjectHelper.requireNonNull(source, "source is null");
            return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));//创建+封装操作
        }
    

    ​ Observable.create()方法传入一个ObservableOnSubscribe对象作为参数,返回一个Observable对象,其内部核心执行的是ObservableCreate<T>(source)。源码如下:

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

    ObservableCreate是Observable的实现类,ObservableCreate<T>(source)将传入的参数-----ObservableCreate对象赋值给ObservableCreate.source。后续的一操作是以该source为基础执行的。

    ​ 除去线程切换的部分,Observable创建完,我们需要调用Observable.subscribe()方法将观察者订阅给Observable。

    在subscribe()方法内部完成真正订阅之前,Consume将被new LambdaObserver<T>(onNext, onError, onComplete, onSubscribe);转换成一个Observer对象。

    ​ Observable.subscribe()方法如下,它传入参数的是我们定义的下游观察者,真正完成订阅的是subscribeActual(observer)方法,将上游的被观察者和观察者结合起来,这是订阅的核心步骤。

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

    ​ 在Observable中,subscribeActual(observer)是一个抽象方法。我们之前提到,Observable.create()方法内部实际创建的是一个ObservableCreate对象,所以,在ObservableCreate中找到真正执行的subscribeActual方法,如下:

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

    ​ 在subscribeActual()方法中,主要执行两个操作:

    1. observer.onSubscribe(parent); // 触发 Observer#onSubscribe(Disposable)

    2. source.subscribe(parent);

      传入事件发射器执行发射事件,发射传给下游观察者的数据,即我们例子中的:

      public void subscribe(ObservableEmitter<Bundle> e) throws Exception {
                      e.onNext(BitmapUtils.getGifBitmapInfo(url));
                  }
      

      我们重点关注的是实际进行发射事件的CreateEmitter.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);
                }
            }
    

    ​ 很简单,它调用observer.onNext()方法将我们传入的Value,传递给下游观察者。而这个observer,正是Observeable.subscribe(Observer<? super T> observer)方法调用subscribeActual(observer);时传入的。

    下一篇:RxJava:线程切换

    相关文章

      网友评论

          本文标题:RxJava:基本订阅流程

          本文链接:https://www.haomeiwen.com/subject/vuzqoftx.html