Android框架|異步-Rxjava2.x(二)

RxJava的簡單使用

1.初始化 Observable
2.初始化 Observer
3.建立訂閱關係

添加依賴

compile 'io.reactivex.rxjava2:rxjava:2.2.1'
compile 'io.reactivex.rxjava2:rxandroid:2.1.0'

代碼實現:

Observable.create(new ObservableOnSubscribe<Integer>() { 
// 第一步:初始化Observable
//決定什麼時候觸發事件以及觸發怎樣的事件
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                Log.e(TAG, "Observable發射 1" + "\n");
                e.onNext(1);
            }
        }).subscribe(new Observer<Integer>() {
        // 第二步:初始化Observer,決定事件觸發的時候將有怎樣的行爲
            // 第三步:訂閱,聯繫起來
        @Override
        public void onSubscribe(@NonNull Disposable d) {
            Log.e(TAG, "調用onSubscribe"+"\n" );
        }

        @Override
        public void onNext(@NonNull Integer integer) {
            Log.e(TAG, "調用onNext : value : " + integer + "\n" );
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.e(TAG, "調用onError : value : " + e.getMessage() + "\n" );
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "調用onComplete" + "\n" );
        }
    });

在這裏插入圖片描述

  • Observable 和 Observer 通過 subscribe() 方法實現訂閱關係,從而 Observable
    可以在需要的時候發出事件來通知 Observer。

常見操作符

  • create
    主要用於產生一個 Obserable 被觀察者對象。

    Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                Log.e(TAG, "Observable發射 1" + "\n");
                e.onNext(1);
                e.onComplete();
                Log.e(TAG, "Observable發射 2" + "\n");
                e.onNext(2);
                Log.e(TAG, "Observable發射 3" + "\n");
                e.onNext(3);
                Log.e(TAG, "Observable發射 4" + "\n" );
                e.onNext(4);
            }
        }).subscribe(new Observer<Integer>() {
            private int i;
            private Disposable mDisposable;
    
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.e(TAG, "調用onSubscribe,是否調用 isDisposed :" + d.isDisposed() + "\n" );
                mDisposable = d;
            }
    
            @Override
            public void onNext(@NonNull Integer integer) {
                Log.e(TAG, "調用onNext : value : " + integer + "\n" );
                i++;
                if (i == 2) {
                    // 在RxJava 2.x 中,新增的Disposable可以做到切斷的操作,讓Observer觀察者不再接收上游事件
                    mDisposable.dispose();
                    Log.e(TAG, "onNext : isDisposable切斷 : " + mDisposable.isDisposed() + "\n");
                }
            }
    
            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG, "調用onError : value : " + e.getMessage() + "\n" );
            }
    
            @Override
            public void onComplete() {
                Log.e(TAG, "調用onComplete" + "\n" );
            }
        });
    

    在這裏插入圖片描述 創建
    Observable 時,回調的是 ObservableEmitter ,並且直接 throws Exception。其次,在創建的
    Observer 中,也多了一個回調方法:onSubscribe,傳遞參數爲Disposable,Disposable 用於解除訂閱。

  • Just
    在創建後就會發送這些對象,相當於執行了數次onNext()。

    Observable.just("1", "2", "3" , "4")
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<String>() {
                        @Override
                        public void accept(@NonNull String s) throws Exception {
                            Log.e(TAG,"accept : onNext : " + s + "\n" );
                        }
                    });
    

    在這裏插入圖片描述
    創建時傳入1、2、3、4, 快速創建被觀察者對象(Observable),最多隻能發送10個以下事件。

  • doOnNext
    讓訂閱者在接收到數據之前可以自定義一些你想讓他做的事情。

     Observable.just(1, 2, 3, 4)
                    .doOnNext(new Consumer<Integer>() {
                        @Override
                        public void accept(@NonNull Integer integer) throws Exception {
                            Log.e(TAG, "doOnNext 哈哈哈"+integer);
                        }
                    }).subscribe(new Consumer<Integer>() {
                @Override
                public void accept(@NonNull Integer integer) throws Exception {
                    Log.e(TAG, "doOnNext 嘿嘿嘿" + integer);
                }
            });
    

    在這裏插入圖片描述

  • map
    作用是對發送的每一個事件應用一個函數,讓每一個事件都按照指定的函數去變化

  • flatMapconcatMap
    這兩個操作符都可以把Observable 通過某種方法轉換爲多個 Observables,然後再把這些分散的 Observables裝進一個單一的 Observable中。區別在於,flatMap
    並不能保證事件的順序,而 concatMap 可以。

  • distinct
    去重

  • Filter
    過濾器,可以接受一個參數,讓其過濾掉不符合我們條件的值。

  • from
    將傳入的數組或 Iterable 拆分成具體對象後,依次發送出來。

參考文檔1
參考文檔2

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