五种观察者模式
被观察者,观察者,subscribe()方法三者缺一不可。只有使用了subscribe(),被观察者才会开始发送数据。
graph LR
A[RxJava 2.x 的五种观察者模式] --> B[Observable 和 Observer]
A --> C[Flowable 和 Subscriber]
A --> E[Single 和 SingleObserver]
A --> F[Completable 和 CompletableObserver]
A --> G[Maybe 和 MaybeObserver]
| 类 型 | 描 述 |
|---|---|
| Observable | 能够发射0或n个数据,并以成功或者错误时间终止 |
| Flowable | 能够发射0或n个数据,并以成功或者错误时间终止。 支持背压,可以控制数据源发射的速度 |
| Single | 只发射单个数据或错误事件 |
| Completable | 从来不发射数据,只处理onComplete和onError事件。 可以看成Rx的Runnable |
| Maybe | 能够发射0或n个数据,要么成功,要么失败。有点类似Optional |
do 操作符
do 操作符可以给Observable的生命周期的各个阶段加上一系列的回调监听,当Observable执行到这个阶段时,这些回调就会被触发。
| 操作符 | 用 途 |
|---|---|
| doOnSubscribe | 一旦观察者订阅了 Observable,它就会被调用 |
| doLifecycle | 可以在观察者订阅之后,设置是否取消订阅 |
| doOnNext | 它产生的 Observable 每发射一项数据就会调用它一次, 它的 Consumer 接受发射的数据项。 一般用于在 subscribe 之前对数据进行处理 |
| doOnEach | 它产生的 Observable 每发射一项数据就会调用它一次, 不仅包括 onNext,还包括 onError 和 onCompleted |
| doAfterNext | 在 onNext 之后执行,而 doOnNext() 是在 onNext 之前执行 |
| doOnComplete | 当它产生的 Observable 在正常终止调用 onComplete 时会被调用 |
| doAfterTerminate | 注册一个Action,当 Observable 调用 onComplete 或 onError 时触发 |
| doFinally | 注册一个Action,当 Observable 调用 onComplete 或 onError 或 dispose 时触发 |
Hot Observable 和 Cold Observable
Hot Observable:无论有没有观察者进行订阅,事件始终都会发生。可以与多个订阅者共享信息。
Cold Observable:只有观察者订阅了,才开始执行发射数据流的代码。Observable 和 Observer 只能是一对一的关系。
Cold Observable
Observable 的 just、create、range、fromXXX 等操作符都能生成Cold Observable
Hot Observable
(1) 使用publish,生成ConnectableObservable,再调用 connect() 才能真正执行。
(2) 使用 Subject/Processor
Flowable
Obserable不再支持背压(Back Pressure),而改由Flowable来支持非阻塞式的背压。
使用Obserable较好的场景:
- 一般处理最大不超过1000条数据,并且几乎不会内存益处;
- GUI 鼠标事件,基本不会背压(可以结合sampling/debouncing操作);
- 处理同步流。
使用Flowable较好的场景:
- 处理以某种方式产生超过10KB的元素;
- 文件读取与分析;
- 读取数据库操作,也是一个阻塞的和基于拉取模式;
- 网络IO;
- 创建一个响应式非阻塞接口。
Single、Completable 和 Maybe
Single
Single只有onSuccess 和 onError事件。
其中,onSuccess()用于发射数据(在 Obserable/Flowable 中使用 onNext()来发射数据),而且只能发射一个数据,后面即使再发射数据也不会做任何处理。
Single.create(new SingleOnSubscribe<String>() {
@Override
public void subscribe(@NonNull SingleEmitter<String> e) throws Exception {
e.onSuccess("test");
}
}).subscribe(new BiConsumer<String, Throwable>() {
@Override
public void accept(String s, Throwable throwable) throw Exception {
System.out.println(s);
}
});
Completable
Completable在创建后,不会发射任何数据。
Completable 只有onComplete 和 onError 事件,同时 Completable 并没有 map、faltmap等操作符
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
System.out.println("Hello World");
}
}).subscribe();
Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(@NonNull CompletableEmitter emitter) throws Exception {
try {
TimeUnit.SECONDS.sleep(1);
emitter.onComplete();
} catch (InterruptedException e) {
emitter.onError(e);
}
}
}).andThen(Observable.range(1,10))
.subscribe(new Consumer<Integer>) {
@Override
public void accept(@NonNull Integer integer) throws Exception {
System.out.println(integer);
}
});
>>>>>
1
2
3
4
5
6
7
8
9
10
Maybe
Maybe 可以看成是Single 和 Completable 的结合。
Maybe 创建之后,MaybeEmitter 和 SingleEmitter 一样,并没有onNext()方法,同样需要通过onSuccess()方法来发射数据。
Maybe 只能发射0或者1个数据,即使发射多个数据,后面发射等数据也不会处理。
Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(@NonNull MaybeEmitter<String> e) throws Exception {
e.onSuccess("testA");
e.onSuccess("testB");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(@Nonnull String s) throws Exception {
System.out.println("s=" + s);
}
});
>>>>>
s=testA
如果先调用了onComplete(),即使后面再调用onSuccess(),也不会发射任何数据。
Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(@NonNull MaybeEmitter<String> e) throws Exception {
e.onComplete();
e.onSuccess("testA");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(@Nonnull String s) throws Exception {
System.out.println("s=" + s);
}
});
>>>>>
不打印任何数据
会执行MaybeObserver 的 onComplete()
Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(@NonNull MaybeEmitter<String> e) throws Exception {
e.onComplete();
e.onSuccess("testA");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(@Nonnull String s) throws Exception {
System.out.println("s=" + s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(@Nonnull Throwable throwable) throws Exception {
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("Maybe onComplete");
}
}
});
>>>>>
Maybe onComplete
Subject 和 Processor
Subject 是一种特殊等存在
Subject 既是 Observable,又是Observer。
public abstract class Subject<T> extends Observable<T> implements Observer<T> {
省略...
}
AsyncSubject
Observer 会接收 AsyncSubject 的 onComplete()之前的最后一个参数。
subject.onComplete()必须要调用才会开始发送数据,否则观察者将不接收任何数据。
BehaviorSubject
Observer 会先接收到 BehaviorSubject 被订阅之前的最后一条数据,再接收订阅者之后发射过来的数据。如果 BehaviorSubject 被订阅前没有发送任何数据,则会发送一个默认数据。
ReplaySubject
ReplaySubject 会发射所有来自原始 Observable 的数据给观察者,无论它们是何时订阅的。
PublishSubject
Observer 只接收 PublishSubject 被订阅之后发送的数据。
| Subject | 发 射 行 为 |
|---|---|
| AsyncSubject | 不论订阅发生在什么时候,只发射最后一个数据 |
| BehaviorSubject | 发送订阅之前的一个数据和订阅之后的全部数据 |
| ReplaySubject | 不论订阅发生在什么时候,都发射全部数据 |
| PublishSubject | 发送订阅之后全部数据 |