天天看點

RxJava學習(二) RxJava 學習(一)

RxJava 學習(一)

上一篇文章,請移步

上一篇介紹了基本的用法,這一篇我們來看一下RxJava更進階的用法

變換!

之前我們寫的代碼裡,觀察者和被觀察者操作的是同一個資料類型 我們現在想 輸入字元串擷取到另外的類型,比如我這裡的例子 User對象

<span style="white-space:pre">		</span>Observable.just("a", "b")
                         .subscribeOn(AndroidSchedulers.mainThread())
                         .observeOn(Schedulers.io())
                         .map(new Func1<String, User>() {

                             @Override
                             public User call(String s) {
                                 try {
                                     Thread.sleep(1000);
                                 } catch (InterruptedException e) {
                                     e.printStackTrace();
                                 }
                                 User user = new User();
                                 user.setName(s);

                                 return user;
                             }
                         })
                         .subscribe(new Action1<User>() {
                             @Override
                             public void call(User user) {
                                Log.e("call", user.getName());
                             }
                         });
           

主要就是通過一個叫map的方法來實作 在map方法中有一個Func1的參數,這個參數就主要實作從String字元串轉換到User對象的邏輯 為了掩飾延時效果,我添加了線程睡眠

還有一個更複雜的變換

<span style="white-space:pre">		</span>String[] str = {"abc", "bcd"};
                Observable.from(str)
                        .subscribeOn(AndroidSchedulers.mainThread())
                        .observeOn(Schedulers.io())
                        .flatMap(new Func1<String, Observable<Integer>>() {
                            @Override
                            public Observable<Integer> call(String s) {
                                char[] c = s.toCharArray();
                                Integer[] is = new Integer[c.length];
                                for (int i = 0; i < c.length; i++) {
                                    is[i] = Integer.valueOf(c[i]);
                                }
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                return Observable.from(is);
                            }
                        })
                        .subscribe(new Action1<Integer>() {
                            @Override
                            public void call(Integer c) {
                                Log.e("test", c + "");
                            }
                        });
           

我這段程式做的是吧字元串數組中的每個字元串的字元對應的ascii碼列印出來 用的是flatMap這個方法 map和flatMap的差別就是,map是轉換成一個對象,而flatMap是轉換成一個Observable對象