這里是我對Rxjava2.0的一些學(xué)習(xí)總結(jié),在此記錄一下愉镰,以后用的時候也方便查找。
如何使用RxJava2
在Android中使用RxJava2只需要在app下的Gradle文件中配置以下兩句即可:
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
了解了如何使用Rxjava2,基礎(chǔ)的東西就先不提起宽,這里說一下RxJava2中一些重要的操作符吧。
事件是從產(chǎn)生它的地方(上游)遮斥,傳遞到接收它的地方(下游)。在這個傳遞的過程中我們可以通過一系列的操作符對數(shù)據(jù)進行修改商膊。
操作符之Map
map操作符用于轉(zhuǎn)換一組數(shù)據(jù)伏伐,可以是對數(shù)據(jù)簡單的加減乘除這種轉(zhuǎn)換,也可以將一個類轉(zhuǎn)成另一個類晕拆。并且map是單一轉(zhuǎn)換藐翎,看下面代碼:
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);
}
});
按照以上的代碼來說,上游發(fā)送的數(shù)據(jù)是123实幕,下游也應(yīng)該接收到123吝镣,不過這里我們用map進行了變換,把123這個數(shù)字改成了“123456”這個字符串昆庇。所以打印結(jié)果是:
10-11 16:02:39.400 6374-6374/com.example.administrator.rxdemo E/accept: ======123456
也就是說map在對Flowable對象進行變換之后返回了一個新的Flowable對象末贾,然后進行之下的操作。
操作符之FlatMap
flatMap操作符的作用是將上游發(fā)送來的單個事件都轉(zhuǎn)化成一個新的Flowable,這個Flowable中又包含若干個事件整吆。然后發(fā)送這些事件拱撵。看下面代碼:
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);
}
});
打印結(jié)果是:
.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不保證事件發(fā)送的順序表蝙,也就是說上面代碼的順序不見得就是11abc拴测,12abc,13abc,上面代碼沒有體現(xiàn)出無序的特點府蛇,發(fā)送事件的時候加上幾秒延遲就能看到了集索。
操作符之ConcatMap
concatMap的做用和flatMap一模一樣,唯一的區(qū)別就在于cancatMap保證事件發(fā)送的順序是有序的汇跨,即嚴格按照上游發(fā)送的順序务荆。
操作符之take
take操作符非常簡單,用于指定訂閱者最多收到多少數(shù)據(jù)穷遂,使用起來也是很簡單:
.take(12)
這里就表示訂閱者最多能接收到12個數(shù)據(jù)函匕。
操作符之filter
filter操作符的作用是過濾數(shù)據(jù),也就是對于上游發(fā)送的數(shù)據(jù)進行篩選蚪黑,看代碼:
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);
}
});
打印結(jié)果是:
.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======14
通過代碼和打印結(jié)果可以清楚的看到通過filter操作符篩選之后浦箱,從上游發(fā)送的數(shù)據(jù)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);
}
});
注意看打印結(jié)果:
.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
很清楚了毅糟,每次處理事件(打印數(shù)字)之前都先做了打印“哈哈哈”這件事红选,也就是我們的doOnNext操作符起了作用。
操作符之zip
zip操作符的目的是合并多個被觀察者的數(shù)據(jù)流姆另,然后發(fā)送最終合并的數(shù)據(jù)喇肋。有一種場景是 當(dāng)某界面內(nèi)容來源不同,但需同時顯示出來時迹辐。這時候就可以使用zip操作符蝶防,zip操作符可以將幾方數(shù)據(jù)組合好后同時展示出來。
zip事件的過程就是分別從發(fā)射器 A 和發(fā)射器 B 各取出一個事件來組合明吩,并且一個事件只能被使用一次间学,組合的順序是嚴格按照事件發(fā)送的順序來進行的,比如印荔,A為12345低葫,B為ABCD,1 永遠是和 A 結(jié)合的,2 永遠是和 B 結(jié)合的仍律。
最終接收器收到的事件數(shù)量是和發(fā)送器發(fā)送事件最少的那個發(fā)送器的發(fā)送事件數(shù)目相同嘿悬。
Rxjava2中的操作符有很多,這里只寫出了一小部分染苛。趁著剛學(xué)了記錄一下鹊漠。