RxJava2深度学习(一)

虽然一直都有在用RxJava2,但是很惭愧的是,一直都只是在和Retrofit配合使用的时候用了一下,总感觉自己确实还不怎么理解RxJava2。看着RxJava中各种各样的操作符,有点力不从心的感觉。可耻地连代码都看不懂的话,实在说不过去哈。
下面进入正题
使用RxJava2,需要先配置build.gradle:
这是目前最新的版本

compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

RxJava的核心就是观察者模式:被观察者、观察者、订阅关系
借用一位博主的话来说,将被观察者比喻为上游(Observable),观察者为下游(Observer),嘻嘻
下面看一下代码:
1.创建一个上游(Obervable):

//创建一个上游
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d("----", "subscribe: 上游发送事件:1");
                e.onNext(1);
                Log.d("----", "subscribe: 上游发送事件:1");
                e.onNext(2);
                Log.d("----", "subscribe: 上游发送事件:1");
                e.onNext(3);
                Log.d("----", "subscribe: 上游结束发送");
                e.onComplete();
            }
        });

ObservableEmitter:是事件发射器的意思。

2.创建一个下游(Observer):

 //创建一个下游
Observer<Integer> observer = new Observer<Integer>() {
       @Override
        public void onSubscribe(Disposable d) {
            Log.d("----", "onSubscribe: 下游订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.d("----", "onNext: 下游接收事件:"+integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.d("----", "onError: 下游报错:"+e);
        }

        @Override
        public void onComplete() {
            Log.d("----", "onComplete: 下游接收完了事件");
        }
    };

我们可以看到打印出来的内容是:

02-02 16:32:13.809 12913-12913/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:32:13.809 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:2
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游发送事件:1
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onNext: 下游接收事件:3
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送
02-02 16:32:13.810 12913-12913/com.ckw.rxjava2demo D/----: onComplete: 下游接收完了事件

从上面的Log日志我们可以看出,首先调用的是下游的订阅方法,接着上游开始发送事件,上游发送一个,下游就接收一个,当上游说我要结束发送事件了,下游也就关闭了事件的接收。

接着我们再看一个例子:

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d("----", "subscribe: 上游发送:1");
                e.onNext(1);
                Log.d("----", "subscribe: 上游发送:2");
                e.onNext(2);
                Log.d("----", "subscribe: 上游发送:3");
                e.onNext(3);
                Log.d("----", "subscribe: 上游结束发送事件:complete");
                e.onComplete();

            }
        }).subscribe(new Observer<Integer>() {
            private int i;
            private Disposable disposable;
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("----", "onSubscribe: 下游订阅");
                disposable = d;
            }

            @Override
            public void onNext(Integer integer) {
                Log.d("----", "onNext: "+integer);
                i++;
                if(i == 2){
                    Log.d("----", "onNext: disposable");
                    disposable.dispose();
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.d("----", "onError: 下游报错"+e);
            }

            @Override
            public void onComplete() {
                Log.d("----", "onComplete: 下游结束接收");
            }
        });

这个例子的意思是上游总共发送三个事件,而下游接收到两个事件后,就将连接断开,测试是否还能接收到上游的事件
下面看一下Log:

02-02 16:42:13.266 14571-14571/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:42:13.266 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:1
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: 1
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:2
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: 2
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: onNext: disposable
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游发送:3
02-02 16:42:13.267 14571-14571/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送事件:complete

可以从Log中看出来,当下游切断连接之后,上游继续发送的事件,下游就接收不到了。

再看一个例子:

 //2
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.d("----", "subscribe: 上游发送:1");
                e.onNext(1);
                Log.d("----", "subscribe: 上游发送:2");
                e.onNext(2);
                Log.d("----", "subscribe: 上游发送:3");
                e.onNext(3);
                Log.d("----", "subscribe: 上游结束发送事件:complete");
                e.onComplete();
                Log.d("----", "subscribe: 上游发送:4");
                e.onNext(4);
            }
        }).subscribe(new Observer<Integer>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.d("----", "onSubscribe: 下游订阅");

            }

            @Override
            public void onNext(Integer integer) {
                Log.d("----", "onNext:下游接收到的事件: "+integer);
            }

            @Override
            public void onError(Throwable e) {
                Log.d("----", "onError: 下游报错"+e);
            }

            @Override
            public void onComplete() {
                Log.d("----", "onComplete: 下游结束接收");
            }
        });

上游先发送三个事件,然后告诉下游我发送完毕了,结果又发送了一个事件给下游,看下游是否会接收。
看一下Log输出:

02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: onSubscribe: 下游订阅
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:1
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 1
02-02 16:46:58.050 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:2
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 2
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:3
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onNext:下游接收到的事件: 3
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游结束发送事件:complete
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: onComplete: 下游结束接收
02-02 16:46:58.051 15341-15341/com.ckw.rxjava2demo D/----: subscribe: 上游发送:4

Log显示,当下游结束接收后,上游再发送的事件,下游是接收不到的!

结尾总结:
1.上游可以发送无限个onNext, 下游也可以接收无限个onNext.
2.当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件
3.当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
4.上游可以不发送onComplete或onError.
5.最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError,
也不能先发一个onComplete, 然后再发一个onError, 反之亦然

猜你喜欢

转载自blog.csdn.net/ckwccc/article/details/79241018