观察者模式
观察者模式,有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
RxJava1.0和RxJava2.0的核心思想都是观察者模式,只不过RxJava2.0在RxJava1.0的基础对一些方法进行了优化,方便于开发者更好地理解其编程思想,同时又增加了一部分新的方法解决1.0存在的问题(背压等)。
使用示例
创建被观察者
Observable observable=Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
}
});
Observable(被观察者)通过create方法生成对象,里面放的参数ObservableOnSubscribe<T>,重写subscribe方法,里面写具体的计划,在subscribe中的ObservableEmitter<String>对象的Emitter是发射器的意思。
ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void onError(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。
创建观察者
Observer<String> observer =new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable=d;
}
@Override
public void onNext(String value) {
if ("2".equals(value)){
mDisposable.dispose();
return;
}
}
@Override
public void onError(Throwable e) {
Log.error("error="+e.getMessage());
}
@Override
public void onComplete() {
Log.log("onComplete()");
}
};
通过new创建接口,并实现其内部的方法,onNext、onError、onComplete跟被观察者发射的方法一一对应。onSubscribe(Disposable d)里面的Disposable对象为订阅关系,如果不想再订阅了,可以调用 mDisposable.dispose()取消订阅。
建立订阅关系
observable.subscribe(observer);
RxJava2的五种观察者模式
类型 | 描述 |
---|---|
Observable | 能够发射0或n个数据,并以成功或者错误事件终止 |
Flowable | 能够发射0或n个数据,并以成功或者错误事件终止。支持背压,可以控制数据源发射的速度,唯一支持背压 |
Single | 只发射单个数据或者错误事件 |
Completable | 从来不发射数据,只处理onComplete和onError事件。可以看成Rx的Runnable |
Maybe | 能够发射0或者1个数据,要么成功,要么失败。有点类似于Optional |
do操作符
操作符 | 用途 |
---|---|
doOnSubscribe | 一旦观察者订阅了Observable,它就会被调用 |
doOnLifecycle | 可以在观察者订阅之后,设置是否取消订阅 |
doOnNext | 它产生的Observable每发射一项数据就会调用它一次,它的Consumer接受发射的数据项。一般用于在subscribe之前对数据进行处理 |
doOnEach | 它产生的Observable每发射一项数据就会调用它一次,不仅包括onNext,还包括onError和onComplete |
doAfterNext | 在onNext之后执行,而doOnNext()是在onNext之前执行 |
doOnComplete | 当产生的Observable在正常终止调用onComplete时会被调用 |
doFinally | 在当它产生的Observable终止之后会被调用,无论是正常终止还是异常终止。doFinally优先于doAfterTerminate的调用 |
doAfterTerminate | 注册一个Action,当Observable调用onComplete或onError时调用 |
Flowable
Flowable支持堵塞式背压。Flowable可以看成Observable新的实现,它支持背压,同时实现Reactive Streams的Publisher接口。Flowable所有的操作符强制支持背压,不过幸运的是,Flowable中的操作符大多与Observable类似。
使用Observable较好的场景
- 一般处理最大不超过1000条数据,并且几乎不会出现内存溢出
- GUI鼠标事件,基本不会背压(可以结合 sampling/debouncing操作)
- 处理同步流
使用Flowable较好的场景
- 处理以某种方式产生超过10KB的元素
- 文件读取与分析
- 读取数据库记录,也是一个堵塞的和基于拉取模式
- 网络I/O
- 创建一个响应式非堵塞接口