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對象