1. 程式人生 > >學習RxJava2.0的一些記錄

學習RxJava2.0的一些記錄

RxJava2的幾個常用操作符

這裡是我對Rxjava2.0的一些學習總結,在此記錄一下,以後用的時候也方便查詢。

如何使用RxJava2

在Android中使用RxJava2只需要在app下的Gradle檔案中配置以下兩句即可:

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

瞭解瞭如何使用Rxjava2,基礎的東西就先不提,這裡說一下RxJava2中一些重要的操作符吧。
事件是從產生它的地方(上游),傳遞到接收它的地方(下游)。在這個傳遞的過程中我們可以通過一系列的操作符對資料進行修改。

操作符之Map

map操作符可以把一個事件轉換成另一個事件,看下面程式碼:

        Flowable.just(123)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return 123+"456";
                    }
                }).
subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.e("accept", "======" + s); } });

按照以上的程式碼來說,上游傳送的資料是123,下游也應該接收到123,不過這裡我們用map進行了變換,把123這個數字改成了“123456”這個字串。所以列印結果是:

10-11 16:02:39.400 6374-6374/com.example.administrator.rxdemo E/accept: ======123456

也就是說map在對Flowable物件進行變換之後返回了一個新的Flowable物件,然後進行之下的操作。

操作符之FlatMap

flatMap操作符的作用是將上游傳送來的單個事件都轉化成一個新的Flowable,這個Flowable中又包含若干個事件。然後傳送這些事件。看下面程式碼:

    Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .flatMap(new Function<Integer, Publisher<String>>() {
            @Override
            public Publisher<String> apply(Integer integer) throws Exception {
                List<String> list=new ArrayList<String>();
                for (int i = 0; i < 2; i++) {
                    list.add(integer+"abc");
                }
                return Flowable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e("accept", "======" + s);
            }
        });

列印結果是:

.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======13abc
.administrator.rxdemo E/accept: ======13abc

flatMap不保證事件傳送的順序,也就是說上面程式碼的順序不見得就是11abc,12abc,13abc,上面程式碼沒有體現出無序的特點,傳送事件的時候加上幾秒延遲就能看到了。

操作符之ConcatMap

concatMap的做用和flatMap一模一樣,唯一的區別就在於cancatMap保證事件傳送的順序是有序的,即嚴格按照上游傳送的順序。

操作符之take

take操作符非常簡單,用於指定訂閱者最多收到多少資料,使用起來也是很簡單:

   .take(12)

這裡就表示訂閱者最多能接收到12個數據。

操作符之filter

filter操作符的作用是過濾資料,也就是對於上游傳送的資料進行篩選,看程式碼:

         Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(10);
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .filter(new Predicate<Integer>() {
               @Override
               public boolean test(Integer integer) throws Exception {
                   if(integer>12){
                       return true;
                   }
                   return false;
               }
           }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

列印結果是:

.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======14

通過程式碼和列印結果可以清楚的看到通過filter操作符篩選之後,從上游傳送的資料10,11,12,13,14,並沒有完全被下游接收。只有13,14被接收了。也就是說filter操作符起了作用。

操作符之doOnNext

doOnNext的作用就是在每個事件被處理之前做一些操作。下面程式碼我是讓每次處理事件之前都列印一句“哈哈哈”,看程式碼就清楚了:

        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
         .doOnNext(new Consumer<Integer>() {
             @Override
             public void accept(Integer integer) throws Exception {
                 Log.e("accept", "======" + "哈哈哈");
             }
         }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

注意看列印結果:

.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======12
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======14

很清楚了,每次處理事件(列印數字)之前都先做了列印“哈哈哈”這件事,也就是我們的doOnNext操作符起了作用。

Rxjava2中的操作符有很多,這裡只寫出了一小部分。趁著剛學了記錄一下。