1. 程式人生 > >RXJava入門總結以及簡易Demo

RXJava入門總結以及簡易Demo

Rxjava由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎

在android開發框架中:RxJava+Retrofit+MVP+Dagger2(主流框架)中Rxjava是對網路連線處理和圖片載入處理非常好用的非同步操作方法,類似於Android中的AysncTask、Handler

Rxjava的模式類似於Java的觀察者模式

被觀察者:Observable

觀察者:Observer

通過訂閱來關聯觀察者和被觀察者:Subscribe

然後我覺得比較重要線上程切換方面的兩個方法的區別:

ObserveOn

指定一個觀察者在哪個排程器上觀察這個Observable

SubscribeOn

指定Observable自身在哪個排程器上執行

補充:對事件匯流排有理解的的,還可以去檢視一下RxBus來看一下Rxjava的事件匯流排處理機制

下面通過一個demo來簡易介紹Rxjava怎麼使用:

開發的IDE是android studio ,如果你是eclipse請點右上角的X

build.grade(app)中新增依賴:

implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
第一個Demo是將被觀察者和觀察者和訂閱都分開寫。

建立被觀察者:

 Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(4);//要傳送的事件
            }
        });//建立被觀察者

建立觀察者

  Observer<Integer> observer = new Observer<Integer>() {
            private Disposable mDisposable;
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始採用subscribe連線");
                mDisposable = d;
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件" + value + "作出相應");
                if(value == 2){
                    mDisposable.dispose();
                    Log.d(TAG,"已經斷開連線:"+mDisposable.isDisposed());
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應");
            }
        };

補充:程式碼中有一行這個程式碼解釋一下

            private Disposable mDisposable;

這個程式碼是訂閱者和被訂閱者的關係斷開的一個控制變數。

取消訂閱:

mDisposable.dispose();
取消訂閱後,觀察者就無法在接受被觀察者發來的資訊了

將被觀察者和觀察者通過訂閱關係繫結

observable.subscribe(observer);

但是上面的程式碼,從字面上理解是被觀察者訂閱觀察者,從字面上理解有問題,其實從機制上來說沒問題,我個人的理解就是觀察者相當於一個接收器,而被觀察者是發起訊息的傳送器,傳送器來繫結一個接受器這樣的邏輯,如果不對,還請多多指教。

下面是Rxjava典型的鏈式結構:
Observable.create(new ObservableOnSubscribe<Integer>() {
           @Override
           public void subscribe(ObservableEmitter<Integer> e) throws Exception {
               e.onNext(1);
               e.onNext(2);
               e.onNext(3);
               e.onNext(4);
           }
       }).subscribe(new Observer<Integer>() {
           @Override
           public void onSubscribe(Disposable d) {
               Log.d(TAG,"開始採用subscribe連線");
           }

           @Override
           public void onNext(Integer value) {
                Log.d(TAG,"對Next事件"+value+"作出響應");
           }

           @Override
           public void onError(Throwable e) {
                Log.d(TAG,"對ERROR事件作出響應");
           }

           @Override
           public void onComplete() {
                Log.d(TAG,"對Complete事件作出響應");
           }
       });