學習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中的操作符有很多,這裡只寫出了一小部分。趁著剛學了記錄一下。