RxJava背压Flowable
1.背压:在RxJava的异步场景中,被观察者发送数据太快,以至于操作符和订阅者来不及处理数据,造成buffer溢出。
2.Flowable:RxJava中专门用来支持背压,默认队列大小128,所有操作符强制支持背压。
3.背压策略:
public enum BackpressureStrategy{
MISSING, //通过create创建的Flowable,需要下游指定背压策略
ERROR, //放入Flowable异步缓存池的数据超限,将抛出MissingBackpressureException
BUFFER, //异步缓存池无大小限制,可无限添加数据,不会抛出异常,但会OOM
DROP, //如果Flowable异步缓存池满了,将抛弃将要添加的数据
LATEST //如果Flowable异步缓存池满了,将抛弃将要添加的数据,但强制添加最后一条数据
}
private void Flowable() {
Flowable.create(new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> emitter) {
for (int i = 0; i < 10; i++) {
emitter.onNext(i);
}
emitter.onComplete();
}
},BackpressureStrategy.BUFFER)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "accept: " + integer);
}
});
}
对应的操作符:onBackpressureBuffer(); onBackpressureDrop; onBackpressureLatest();
private void Flowable() {
Flowable.interval(1000, TimeUnit.MILLISECONDS)
.onBackpressureBuffer()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.d(TAG, "accept: "+aLong);
}
});
}
4.Flowable所支持的创建操作符,用法同Observable创建操作符
private void Flowable() {
Flowable.amb();
Flowable.ambArray();
Flowable.create();
Flowable.combineLatest();
Flowable.combineLatestDelayError();
Flowable.concat();
Flowable.concatDelayError();
Flowable.concatArray();
Flowable.concatArrayDelayError();
Flowable.defer();
Flowable.fromArray();
Flowable.fromIterable();
Flowable.fromFuture();
Flowable.fromCallable();
Flowable.fromPublisher();
Flowable.generate();
Flowable.interval();
Flowable.intervalRange();
Flowable.just();
Flowable.merge();
Flowable.mergeDelayError();
Flowable.mergeArray();
Flowable.mergeArrayDelayError();
Flowable.never();
Flowable.range();
Flowable.rangeLong();
Flowable.sequenceEqual();
Flowable.switchOnNext();
Flowable.switchOnNextDelayError();
Flowable.timer();
Flowable.using();
Flowable.zip();
Flowable.zipArray();
Flowable.zipIterable();
}
5.操作符用法同Observable变换操作符
Flowable.interval(500,TimeUnit.MILLISECONDS)
.onBackpressureBuffer()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<Long, Long>() {
@Override
public Long apply(Long aLong) {
return aLong + 1;
}
});