RxJava 二:RxJava 3 观察者模式(原理解析)

本文深入探讨RxJava 3中的Flowable类,详细解析背压策略,包括BackpressureStrategy的不同策略,如BUFFER、DROP等。Flowable作为支持背压的数据源,其发送器FlowableEmitter和Subscriber之间的交互,以及如何通过Subscription的request方法实现按需发送数据。此外,文章还介绍了Observable和ConnectableObservable的区别以及在不同场景下的使用。
摘要由CSDN通过智能技术生成

目录

1.RxJava 3

2.观察者模式组合

3.Flowable(数据源类一)

3.1.Flowable

3.2.BackpressureStrategy背压策略

3.3.响应式拉取(Flowable特有)

3.4.FlowableEmitter(数据发送器)

3.5.背压问题解决方案:(Flowable按需发送数据)

4.Observable(数据源类二)

4.1.Observable

4.2.ConnectableObservable

4.3.refObservable

4.4.autoObservable

5.Observer and Subscriber


1.RxJava 3

JavaDoc

http://reactivex.io/RxJava/3.x/javadoc/

https://github.com/ReactiveX/RxJava/wiki/What's-different-in-3.0

添加依赖

implementation 'io.reactivex.rxjava3:rxjava:3.x.y'

implementation 'io.reactivex.rxjava3:rxandroid:3.x.y'

Java 8(来源于官方文档)

由于Android运行时支持方面的落后,RxJava 长期基于Java 6 API。未来的 Android Studio 4中,一个叫做 desuging 的过程能够将许多Java 7和8的特性,透明地转换成与 Java 6兼容的特性。

So,RxJava3的baseline可以提高到 Java 8,并增加Java 8的官方支持,比如:Optional、Stream等,因此必须将项目的编译目标设置更改为 java8:

android {

    compileOptions {
        sourceCompatibility JavaVersion.
VERSION_1_8
       
targetCompatibility JavaVersion.VERSION_1_8
   
}

}

RxJava 3.0遵循Reactive-Streams specification规范。

2.观察者模式组合

在RxJava 3中,提供了五对观察者模式组合,每一对组合依靠其可调用的一系列函数的差异,具有各自的特点。

第一组:Observable(ObservableSource)/ Observer

一次可发送单条数据或者数据序列onNext,可发送完成通知onComplete或异常通知onError,不支持背压。

第二组:Publisher(Flowable)/ Subscriber(FlowableSubscriber)

第一组基础上进行改进,发送0到N个的数据(onNext),支持Reactive-Streams和背压,可发送完成通知onComplete或异常通知onError,但效率没有第一组高。

第三组:Single(SingleSource) / SingleObserver

第一组简化版,只能发送单条数据onSuccess,或者异常通知onError

第四组:Completable(CompletableSource)/ CompletableObserver

第一组简化版,不能发送数据,只发送完成通知onComplete或者异常通知onError

第五组:Maybe(MaybeSource) / MaybeObserver

第三,第四组的合并版,只能发送单条数据onSuccess和完成通知onComplete或者发送一条异常通知onError

3Flowable(数据源类一)

3.1.Flowable

Flowable是RxJava2.x中新增的,专门用于应对背压(Backpressure)问题,在Observable的基础上优化后的产物。

Observable ——> subscribe() ——> Observer

Flowable ——> subscribe() ——> Subscriber

后者是前者针对背压问题的优化产物,前者运行效率更高,后者支持背压问题处理,但逻辑更多,运行效率稍低,速度稍慢。

Flowable数据流程:Flowable ——> 异步缓存池(128)——> Subscriber

Flowable默认异步缓存队列大小为128。作用是缓存当前未来得及处理(Subscriber未接收,或者由于某种原因,Flowable未实际发送给Subscriber)的数据。也就是说随着Subscriber对数据的接收处理,缓存池也会随之做清理更新:去掉已经被Subscriber接收的,塞进Flowable新发送的。

注意:并不是Subscriber接收一条,便清理一条,而是存在一个延迟,等累积一段时间后统一清理一次。

所以:当生产者和消费者在相同的线程中;或者当生产者和消费者在不同线程中,但消费者消费数据的速度不低于生产者发送数据的速度,或者整条数据流中只有一条数据时 …… 使用Observable会更好。

Flowable

        .create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                System.out.println("发送----> 1");
                e.onNext(1);
                System.out.println("发送----> 2");
                e.onNext(2);
                System.out.println("发送----> 3");
                e.onNext(3);
                System.out.println("发送----> 完成");
                e.onComplete();
            }
        }, BackpressureStrategy.BUFFER) //指定背压处理策略:缓存
        .subscribeOn(Schedulers.newThread())
        .observeOn(Schedulers.newThread())
        .subscribe(new Subscriber<Integer>() {
            @Override
            public void onSubscribe(Subscription s) {
                s.request(Long.MAX_VALUE); // 响应式拉取
            }
            @Override
            public void onNext(Integer integer) {
                System.out.println("接收----> " + integer);
            }
            @Override
            public void onError(Throwable t) {}
            @Override
            public void onComplete() {
                System.out.println("接收----> 完成");
            }
        });

注意:

(1)BackpressureStrategy.BUFFER设置背压处理策略

(2)Subscription区别于Observer的Disposable

(3)发送器FlowableEmitter,不同于Observable的ObservableEmitter

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值