Rxjava2.0概述
通过前面的文章介绍,读者对RxJava2.0应该有了初步的认识。RxJava2.0相对1.0没有增加新的功能,最大的变化是把原来与背压有关的操作符抽取出来放在Flowable中处理;另外2.0的接口定义更符合ReactiveStream的规范。操作符的功能和1.0相比没有太大的变化,不过Flowable是背压相关的功能抽离出来的,本篇我们来详细分析下各种操作符的作用和用法。每种类型的操作符会选择几个重点介绍,提醒读者在阅读的过程中注意操作符背压的处理。另外操作符都是支持泛型的,对泛型不了解的读者,需要先熟悉一下泛型相关的知识。
创建操作符
create操作符
这里首先介绍create操作符,它是使用最广泛的创建操作符。
create操作符的使用场景
create是最基本的操作符,用来创建一个Flowable,事件流的生产和下发由用户自己定义,是一个完全可定制的Flowable。
create操作符的基本使用方法
Flowable.create(new FlowableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull FlowableEmitter<Object> e) throws Exception {
e.onNext("1");
e.onNext("2")
}
}, BackpressureStrategy.BUFFER)
.subscribe(new FlowableSubscriber<Object>() {
Subscription st=null;
@Override
public void onSubscribe(@NonNull Subscription s) {
s.request(1);
st =s;
}
@Override
public void onNext(Object o) {
System.out.print(s);
st.request(1);
}
@Override
public void onComplete() {
}
@Override
public void onError(Throwable throwable) {
}
});
以上输出的结果为:1 2
create方法的
- 第一个参数是FlowableOnSubscribe,它只有一个方法subscribe,subscribe是事件生产的地方,subscribe的参数FlowableEmitter是内部类,其中一个属性是FlowableSubscriber,也就是我们定义的观察者。通过调用 e.onNext("1"),FlowableEmitter会调用观察者onNext的方法即是FlowableSubscriber的onNext方法,从而完成事件下发给观察者。
- 第二个参数是背压策略,RxJava2.0定义了五种背压策略,后续文章会重点讲述背压策略的详细区别。背压策略会影响观察者能否正确接收到事件。
create操作符事件的处理流程
以上面的代码为例,当subscribe(new FlowableSubscriber<Object>()执行时,会首先执行onSubscribe(@NonNull Subscription s)方法,它执行在调用者的线程,对于背压来说,这里需要告知生产者事件的下流观察者的事件处理能力;然后是subscribe(@NonNull FlowableEmitter<Object> e)执行事件的的生产逻辑,这里会判断观察者的处理数据的能力决定是否执行观察者的onNext方法。这里判断的依据是s.request()的参数是否大于零。
create操作符需要注意的地方
前面也提到过,观察者能否接收到事件取决于s.request()的参数是否大于零或者s.request()是否被调用。如果FlowableSubscriber的方法onSubscribe没有调用过s.request(n)或者n<=0 ,FlowableSubscriber不会接收到事件。上面的例子中观察者只能就收到事件"1", 而不能接收"2",因为只调用对s.request(1),如果希望接收到两次事件可以在onSubscribe调用s.request(2),或者是onSubscribe调用s.request(1)并且onNext中调用s.request(1)。
fromArray操作符
fromArray操作符的使用场景
fromArray用于快速创建一个Flowable,直接发送数组的数据。
fromArray操作符的基本使用方法
Flowable.fromArray(new String[]{"1","2","3"})
.subscribe(new FlowableSubscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
s.request(3);
}
@Override
public void onNext(String s) {
System.out.print(s);
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onComplete() {
}
});
以上输出的结果为:1 2 3
fromArray的参数是一个数组,数组的元素会被依次发送出去。
fromArray操作符的事件 执行流程
1 从subscribe(new FlowableSubscriber<String>())方法开始执行;
2 通过内部处理onSubscribe方法会被执行,这里需要背压处理,如果没有调用s.request