RxJava2五大金刚分别为Observable、Flowable、Single、Completable以及Maybe。除了Observable,实际上其余四个的实现方式或者使用方式和Observable类似。都是最终形成形如source.subscribe(observer)此等形式。
Observable已经做了分析,接下来我们来分析下其余四种,主要分析下各自的作用。分析之前要说下,虽然本文称为Observable变种,但是实际上,五大金刚的被观察者角色上并没有直接关系,不过各自的基类都有一个相同的方法——subscribe,这也说明,仍然是以source.subscribe(observer)的形式进行,因此仍然是Observable的变种。
Flowable——支持背压策略的Observable变种
在Observable中,我们使用如下例子进行线程切换在订阅的时候做无限循环,并在观察者处理响应事件中进行长延时。
Observable
.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
int i = 0;
while (true) {
i++;
e.onNext(i);
}
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Thread.sleep(5000);
System.out.println(integer);
}
});
创建一个可观察对象Observable并在Schedulers.newThread线程中不断的发送数据,而观察者在Schedulers.newThread另一个线程中延时5000ms接收数据,这时,由于上游的发送数据快于下游的接收数据处理速度,造成上游的数据积压,内部不断增加,最终变回产生内存溢出,这就是我们所说的背压问题。而Flowable正是处理背压问题的一种Observable变种。
Flowable主要思想在于BackpressureStrategy背压策略,BackpressureStrategy有五种背压策略。Flowable既然我们称为Observable一种变种,那么自然也会有一个subscribeActual抽象方法,实际上,以Flowable的create为例,调用flowable.subscribe(observer)后就进入到对应的具体类FlowableCreate的subscribeActual方法中,我们就可以看到,五种背压方式分别对应五种不对的发射器。具体每个发射器是怎么做处理的,我们再这里不再详细深入,不过要明确的一点就是道理都是一样的,无非是通过一定的策略来确定是接收数据还是丢弃数据,或者报异常处理等,以此来解决上游数据不断发送,下游来不及处理而产生背压的问题。
public void subscribeActual(Subscriber<? super T> t) {
Object emitter;
switch(this.backpressure) {
case MISSING:
emitter = new FlowableCreate.MissingEmitter(t);
break;
case ERROR:
emitter = new FlowableCreate.ErrorAsyncEmitter(t);
break;
case DROP:
emitter = new FlowableCreate.DropAsyncEmitter(t);
break;
case LATEST:
emitter = new FlowableCreate.LatestAsyncEmitter(t);
break;
default:
emitter = new FlowableCreate.BufferAsyncEmitter(t, bufferSize());
}
t.onSubscribe((Subscription)emitter);
try {
this.source.subscribe((FlowableEmitter)emitter);
} catch (Throwable var4) {
Exceptions.throwIfFatal(var4);
((FlowableCreate.BaseEmitter)emitter).onError(var4);
}
}
Single——发射单一数据或异常通知的Observable变种
Single也是Observable的一种变种,Single和Observable不一点就是Obervable可以连续发送多条数据,或者通知,而Single只能发送一次数据或者异常通知,发送了发射器既被dispose。具体可以查看代码,比较简单,这里不再分析。
Completable——发射完成通知或异常通知的Observable变种
Completable也是Observable的一种变种,与Observable和Single不一样的地方就是不能发送数据,只能发送通知,或成功通知,或异常通知,发送了发射器既被dispose。具体可以查看代码,比较简单,这里不再分析。
Maybe——发射一条数据同时可以发送通知或者异常的Observable变种
Maybe也是Observable的一种变种,Maybe在发送完成通知或者异常通知之前发送数据的话,可以继续发送完成通知或者异常通知,若已经发送完成通知或者异常,则发射器已被dispose,则再发送数据观察者也不再接收到。具体可以查看代码,比较简单,这里不再分析。