Flowable
RxJava2.x中,Observable不再支持背压,而改由Flowable来支持非阻塞式的背压。Flowable是RxJava2.x新增的被观察者。Flowable可以看成是Observable新的实现。
Observable和Flowable在场景上还是有区别的:
使用Observable较好的场景:
(1)一般处理最大不超过1000条数据,并且几乎不会出现内存溢出;
(2)GUI鼠标事件,基本不会背压;
(3)处理同步流。
使用Flowable较好的场景:
(1)处理以某种方式产生超过10KB的元素;
(2)文件读取与分析;
(3)读取数据库记录,也是一个阻塞的和基于拉取模式;
(4)网络I/O流;
(5)创建一个响应式非阻塞接口。
Single
Single只有onSuccess和onError事件。
其中onSuccess()用于发射数据,而且只能发射一个数据,后面即使再发射数据也不会做任何处理。
SingleObserver中只有onSuccess和onError,并没有onComplete。这也是Single与其他4种被观察者之间的最大区别。
Single可以通过toXXX转换成Observable、Flowable、Completable以及Maybe。
Single.create(new SingleOnSubscribe<String>() {
@Override
public void subscribe(SingleEmitter<String> emitter) throws Exception {
emitter.onSuccess("");
}
}).subscribe(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) throws Exception {
System.out.println(s);
}
});
Completable
Completable在创建后,不会发射任何数据。Completable只有onComplete和onError事件,同时Completable并没有map、flatmap等操作符,相比Observable/Flowable操作符要少的多。
//通过fromXXX操作符来创建一个Completable
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
System.out.println("Hello World");
}
}).subscribe();
//还可以结合andThen操作符使用
Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emitter) throws Exception {
try {
TimeUnit.SECONDS.sleep(1);
emitter.onComplete();
}catch(InterruptedException e){
emitter.onError(e);
}
}
}).andThen(Observable.range(1,10))//经常结合andThen一起使用 andThen有多个重载方法,正好对应5种被观察者类型
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(integer);
}
});
Maybe
Maybe可以看成是Single和Completable的结合。需要通过onSuccess()方法发射数据。
Maybe也只能发射0或者1个数据,即使发射多个数据,后面发射的数据也不会处理。
如果MaybeEmitter先调用了onComplete(),即使后面再调用onSuccess(),也不会发射任何数据。
Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(MaybeEmitter<String> emitter) throws Exception {
emitter.onSuccess("1");
emitter.onComplete();
emitter.onSuccess("2");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println("s = " + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
}, new Action() {
@Override
public void run() throws Exception {
//Maybe在没有数据发射时,subscribe会调用MaybeObserver的onComplete()。
//如果Maybe有数据发射或者调用了onError(),则不会执行MaybeObserver的onComplete()。
System.out.println("Maybe onComplete");
}
});
RxJava中有5种不同类型的被观察者:Observable、Flowable、Single、Completable、Maybe。这些被观察者在一定程度上能够做一些相互转换。值得注意的是,只有Flowable是支持背压的,其余4种都不支持。
对于Observable的基本使用方法,可以参考这篇文章 RxJava中Observable的含义及基本用法