RxJava中的Flowable、Single、Completable和Maybe

Flowable

RxJava2.x中,Observable不再支持背压,而改由Flowable来支持非阻塞式的背压。Flowable是RxJava2.x新增的被观察者。Flowable可以看成是Observable新的实现。
Observable和Flowable在场景上还是有区别的:
使用Observable较好的场景:
(1)一般处理最大不超过1000条数据,并且几乎不会出现内存溢出;
(2)GUI鼠标事件,基本不会背压;
(3)处理同步流。
使用Flowable较好的场景:
(1)处理以某种方式产生超过10KB的元素;
(2)文件读取与分析;
(3)读取数据库记录,也是一个阻塞的和基于拉取模式;
(4)网络I/O流;
(5)创建一个响应式非阻塞接口。

Single

Single只有onSuccess和onError事件。
其中onSuccess()用于发射数据,而且只能发射一个数据,后面即使再发射数据也不会做任何处理。
SingleObserver中只有onSuccess和onError,并没有onComplete。这也是Single与其他4种被观察者之间的最大区别。
Single可以通过toXXX转换成Observable、Flowable、Completable以及Maybe。

Single.create(new SingleOnSubscribe<String>() {
    @Override
    public void subscribe(SingleEmitter<String> emitter) throws Exception {
        emitter.onSuccess("");
    }
}).subscribe(new BiConsumer<String, Throwable>() {
    @Override
    public void accept(String s, Throwable throwable) throws Exception {
        System.out.println(s);
    }
});

Completable

Completable在创建后,不会发射任何数据。Completable只有onComplete和onError事件,同时Completable并没有map、flatmap等操作符,相比Observable/Flowable操作符要少的多。

//通过fromXXX操作符来创建一个Completable
Completable.fromAction(new Action() {
    @Override
    public void run() throws Exception {
        System.out.println("Hello World");
    }
}).subscribe();

//还可以结合andThen操作符使用
Completable.create(new CompletableOnSubscribe() {
    @Override
    public void subscribe(CompletableEmitter emitter) throws Exception {
        try {
            TimeUnit.SECONDS.sleep(1);
            emitter.onComplete();
        }catch(InterruptedException e){
            emitter.onError(e);
        }
    }
}).andThen(Observable.range(1,10))//经常结合andThen一起使用 andThen有多个重载方法,正好对应5种被观察者类型
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
            }
        });

Maybe

Maybe可以看成是Single和Completable的结合。需要通过onSuccess()方法发射数据。
Maybe也只能发射0或者1个数据,即使发射多个数据,后面发射的数据也不会处理。
如果MaybeEmitter先调用了onComplete(),即使后面再调用onSuccess(),也不会发射任何数据。

Maybe.create(new MaybeOnSubscribe<String>() {
    @Override
    public void subscribe(MaybeEmitter<String> emitter) throws Exception {
        
        emitter.onSuccess("1");
        emitter.onComplete();
        emitter.onSuccess("2");
    }
}).subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        System.out.println("s = " + s);
    }
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        
    }
}, new Action() {
    @Override
    public void run() throws Exception {
        //Maybe在没有数据发射时,subscribe会调用MaybeObserver的onComplete()。
        //如果Maybe有数据发射或者调用了onError(),则不会执行MaybeObserver的onComplete()。
        System.out.println("Maybe onComplete");
    }
});

RxJava中有5种不同类型的被观察者:Observable、Flowable、Single、Completable、Maybe。这些被观察者在一定程度上能够做一些相互转换。值得注意的是,只有Flowable是支持背压的,其余4种都不支持。
对于Observable的基本使用方法,可以参考这篇文章 RxJava中Observable的含义及基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值