浅析RxJava2.0

观察者模式

观察者模式,有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

RxJava1.0和RxJava2.0的核心思想都是观察者模式,只不过RxJava2.0在RxJava1.0的基础对一些方法进行了优化,方便于开发者更好地理解其编程思想,同时又增加了一部分新的方法解决1.0存在的问题(背压等)。

使用示例

创建被观察者

 Observable observable=Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
                emitter.onComplete();
            }
        });

Observable(被观察者)通过create方法生成对象,里面放的参数ObservableOnSubscribe,重写subscribe方法,里面写具体的计划,在subscribe中的ObservableEmitter对象的Emitter是发射器的意思。

ObservableEmitter有三种发射的方法,分别是void onNext(T value)、void onError(Throwable error)、void onComplete(),onNext方法可以无限调用,Observer(观察者)所有的都能接收到,onError和onComplete是互斥的,Observer(观察者)只能接收到一个,OnComplete可以重复调用,但是Observer(观察者)只会接收一次,而onError不可以重复调用,第二次调用就会报异常。

创建观察者

Observer observer =new Observer() {
            @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
  • 创建一个响应式非堵塞接口

你可能感兴趣的:(浅析RxJava2.0)