RxJava2:操作符执行顺序和数据传递方向

栏目: Java · 发布时间: 7年前

内容简介:以Observable为例,先上代码:这里每次调用一个操作符,返回的都是Observable的直接子类或者间接之类.以just为例:这里重新new了一个Observable的子类对象

以Observable为例,先上代码:

//①
ObservableJust<String> observable = (ObservableJust<String>) Observable.just("hello rxjava2");
//②
        ObservableSubscribeOn<String> subscribe = (ObservableSubscribeOn<String>) observable.subscribeOn(Schedulers.io());
//③
        ObservableObserveOn<String> observerOn = (ObservableObserveOn<String>) subscribe.observeOn(AndroidSchedulers.mainThread());
//④
        ObservableDoFinally<String> doFinally = (ObservableDoFinally<String>) observerOn.doFinally(new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("doFinally");
            }
        });
//⑤
        ObservableDoOnLifecycle<String> doOnSubscribe = (ObservableDoOnLifecycle<String>) doFinally.doOnSubscribe(new Consumer<Disposable>() {
            @Override
            public void accept(Disposable disposable) throws Exception {
                System.out.println("doOnSubscribe: " + disposable.hashCode());
            }
        });
//⑥
        doOnSubscribe.subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                       System.out.println("onSubscribe: "+d.hashCode());
                      /*  if (!d.isDisposed()){
                           System.out.println("onSubscribe: dispose");
                           d.dispose();
                       }*/
                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println("onNext: "+s);
                        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println("onError: "+e.getMessage());
                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete");
                        Toast.makeText(MainActivity.this, "onComplete", Toast.LENGTH_SHORT).show();
                    }
                });

这里每次调用一个操作符,返回的都是Observable的直接子类或者间接之类.以just为例:

public static <T> Observable<T> just(T item) {
        ObjectHelper.requireNonNull(item, "The item is null");
        return RxJavaPlugins.onAssembly(new ObservableJust<T>(item));
    }

这里重新new了一个Observable的子类对象 ObservableJust .

结论如下:

  1. 每个操作符都会对应返回一个Observable的子类对象,类名格式ObservableXXX然后去调用下一个操作符.比如interval操作符,返回的是ObservableInterval的实例对象.
  2. 对于Observable的创建型操作符,返回的是其直接子类,而其他操作符,返回的是AbstractObservableWithUpstream的子类对象.AbstractObservableWithUpstream的构造函数中,第一个参数就是Observable对象,这一点非常重要,这个参数是上一个操作符返回的Observable对象.这保证了整个调用流程的起始处的Observable对象能在整个流程中传递.

RxJava2:操作符执行顺序和数据传递方向

操作符的调用是由上至下,顺序调用的.数据流的传递流程是怎么样的?

数据流的传递

如果没有最下游的观察者对数据做接收,整个调用流程是不会执行的.

先从⑥开始看 ObservableDoOnLifecycle 的subscribe方法做了什么.

@Override
    protected void subscribeActual(Observer<? super T> observer) {
        source.subscribe(new DisposableLambdaObserver<T>(observer, onSubscribe, onDispose));
    }

source 就是上游操作符返回的 Observable 的子类对象,通过 AbstractObservableWithUpstream 的构造函数传递给下游的.这里去调用了上一个 Observable 对象的 subscribe 方法.这个调用由下至上,直到整个流程的起始处.

RxJava2:操作符执行顺序和数据传递方向

下一步看数据是怎么传递的?


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

维多利亚时代的互联网

维多利亚时代的互联网

[英] 汤姆·斯丹迪奇 / 多绥婷 / 后浪丨江西人民出版社 / 2017-8 / 38.00元

人类历史上的第一次大连接 回顾互联网的前世 预言互联网的未来 ……………… ※编辑推荐※ ☆《财富》杂志推荐的75本商务人士必读书之一 ☆ 回顾互联网的前世,颠覆你的思维,升级你对互联网的认知 ☆ 人类历史上一次全球大连接是维多利亚时期的电报时代,那时候也有疯狂的资本、 巨大的泡沫、网络新型犯罪、网络亚文化崛起……现在的互联网时代就是电报时代的重演;回顾那......一起来看看 《维多利亚时代的互联网》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具