这里是我对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操作符用于转换一组数据,可以是对数据简单的加减乘除这种转换,也可以将一个类转成另一个类。并且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操作符起了作用。
操作符之zip
zip操作符的目的是合并多个被观察者的数据流,然后发送最终合并的数据。有一种场景是 当某界面内容来源不同,但需同时显示出来时。这时候就可以使用zip操作符,zip操作符可以将几方数据组合好后同时展示出来。
zip事件的过程就是分别从发射器 A 和发射器 B 各取出一个事件来组合,并且一个事件只能被使用一次,组合的顺序是严格按照事件发送的顺序来进行的,比如,A为12345,B为ABCD,1 永远是和 A 结合的,2 永远是和 B 结合的。
最终接收器收到的事件数量是和发送器发送事件最少的那个发送器的发送事件数目相同。
Rxjava2中的操作符有很多,这里只写出了一小部分。趁着刚学了记录一下。
网友评论