emmmm......本来我以为Rxjava应该写完了,但是仔细想想,还有一个比较重要的概念还没有涉及到,那就是“背压”。
一开始看RxJava的文档时看到背压这个概念的时候我是拒绝的,因为,你不能说这是背压,我就能理解这就是背压,我要自己试一下,我试过之后再告诉你们,我试过之后知道这是背压,你们看完之后也会知道。
想象一个经典的生产者消费者模型,生产者与消费者处在不同的线程。如果生产者发出的事件能够立即被消费者处理,那是最好的。如果生产者发出的事件让消费者来不及处理,那就会导致事件越来越多,这个对内存以及整个模型的事件传递都是非常不好的。打个比方,一个厨师每分钟生产一个蛋糕,一个顾客每小时吃一个蛋糕,N久时间之后,蛋糕就越来越多。那怎么处理呢,餐厅给出以下方案:
1、按步骤般一个一个来
2、把最新生产的蛋糕丢弃
3、把最早生产的蛋糕丢弃
4、顾客想吃的时候,厨师才生产蛋糕,想吃多少就生产多少
· · · · · ·
以上种种解决这种生产快于消费的策略就称为背压
Rxjava中没有专门的操作符来处理背压,但是有专门的对象来处理可能需要背压的情况。RxJava的被观察者可以被分为Observable、Flowable、Single、Maybe、Completable这五大类,但是只有Observable和Flowable两大类能够生产多个事件传递给下游的观察者,也就是说只有他俩才有可能需要背压的处理。而Observable处理背压的情况就是通过toFlowable方法将自己转换成Flowable进行处理,所以总结如下:Flowable是专门用来处理背压的。
Flowable与Observable在使用上面也差不多,但是create方法多了一个BackpressureStrategy参数,即背压策略的选择。
public enum BackpressureStrategy {
MISSING,
ERROR,
BUFFER,
DROP,
LATEST;
private BackpressureStrategy() {
}
}
这里提供了5种策略,其中MISSING是上游产生事件就立即传递到下游,其它几种策略都需要下游请求,才能收到事件。
他们的区别在于对生产事件的缓存处理。
我们来看一下Flowable的观察者FlowableSubscriber
public interface FlowableSubscriber<T> extends Subscriber<T> {
void onSubscribe(Subscription var1);
}
这里的Subscription就是用来向上游请求事件下发的类,在需要的时候调用request方法请求下发的数量。
占坑,晚点再写。。。