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, 反之亦然

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章