RxJava2的Observable变种之五大金刚

RxJava2五大金刚分别为Observable、Flowable、Single、Completable以及Maybe。除了Observable,实际上其余四个的实现方式或者使用方式和Observable类似。都是最终形成形如source.subscribe(observer)此等形式。

Observable已经做了分析,接下来我们来分析下其余四种,主要分析下各自的作用。分析之前要说下,虽然本文称为Observable变种,但是实际上,五大金刚的被观察者角色上并没有直接关系,不过各自的基类都有一个相同的方法——subscribe,这也说明,仍然是以source.subscribe(observer)的形式进行,因此仍然是Observable的变种。

Flowable——支持背压策略的Observable变种
在Observable中,我们使用如下例子进行线程切换在订阅的时候做无限循环,并在观察者处理响应事件中进行长延时。

Observable
        .create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                int i = 0;
                while (true) {
                    i++;
                    e.onNext(i);
                }
            }
        })
        .subscribeOn(Schedulers.newThread())
        .observeOn(Schedulers.newThread())
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Thread.sleep(5000);
                System.out.println(integer);
            }
        });

创建一个可观察对象Observable并在Schedulers.newThread线程中不断的发送数据,而观察者在Schedulers.newThread另一个线程中延时5000ms接收数据,这时,由于上游的发送数据快于下游的接收数据处理速度,造成上游的数据积压,内部不断增加,最终变回产生内存溢出,这就是我们所说的背压问题。而Flowable正是处理背压问题的一种Observable变种。

Flowable主要思想在于BackpressureStrategy背压策略,BackpressureStrategy有五种背压策略。Flowable既然我们称为Observable一种变种,那么自然也会有一个subscribeActual抽象方法,实际上,以Flowable的create为例,调用flowable.subscribe(observer)后就进入到对应的具体类FlowableCreate的subscribeActual方法中,我们就可以看到,五种背压方式分别对应五种不对的发射器。具体每个发射器是怎么做处理的,我们再这里不再详细深入,不过要明确的一点就是道理都是一样的,无非是通过一定的策略来确定是接收数据还是丢弃数据,或者报异常处理等,以此来解决上游数据不断发送,下游来不及处理而产生背压的问题。

public void subscribeActual(Subscriber<? super T> t) {
    Object emitter;
    switch(this.backpressure) {
    case MISSING:
        emitter = new FlowableCreate.MissingEmitter(t);
        break;
    case ERROR:
        emitter = new FlowableCreate.ErrorAsyncEmitter(t);
        break;
    case DROP:
        emitter = new FlowableCreate.DropAsyncEmitter(t);
        break;
    case LATEST:
        emitter = new FlowableCreate.LatestAsyncEmitter(t);
        break;
    default:
        emitter = new FlowableCreate.BufferAsyncEmitter(t, bufferSize());
    }

    t.onSubscribe((Subscription)emitter);

    try {
        this.source.subscribe((FlowableEmitter)emitter);
    } catch (Throwable var4) {
        Exceptions.throwIfFatal(var4);
        ((FlowableCreate.BaseEmitter)emitter).onError(var4);
    }

}

Single——发射单一数据或异常通知的Observable变种
Single也是Observable的一种变种,Single和Observable不一点就是Obervable可以连续发送多条数据,或者通知,而Single只能发送一次数据或者异常通知,发送了发射器既被dispose。具体可以查看代码,比较简单,这里不再分析。

Completable——发射完成通知或异常通知的Observable变种
Completable也是Observable的一种变种,与Observable和Single不一样的地方就是不能发送数据,只能发送通知,或成功通知,或异常通知,发送了发射器既被dispose。具体可以查看代码,比较简单,这里不再分析。

Maybe——发射一条数据同时可以发送通知或者异常的Observable变种
Maybe也是Observable的一种变种,Maybe在发送完成通知或者异常通知之前发送数据的话,可以继续发送完成通知或者异常通知,若已经发送完成通知或者异常,则发射器已被dispose,则再发送数据观察者也不再接收到。具体可以查看代码,比较简单,这里不再分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值