浅析RxJava2.0

观察者模式

观察者模式,有时又被称为模型(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
  • 创建一个响应式非堵塞接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值