Android中RxJava使用详解

583 阅读5分钟

1,RxJava介绍

一个基于事件流,实现异步的操作库,RxJava是基于事件流的链式调用,随着事件逻辑复杂性的提高,仍然能保持优雅简洁

RxJava的异步实现,是通过一种扩展的观察者模式来实现的。观察者模式面向的需求是:A对象(观察者)对B对象的某种变化高度敏感,需要在B对象变化的一瞬间做出变化,程序的观察者模式,观察者不需要时刻盯着被观察者,而是采用注册(Regsiter)或者订阅(subScribe)

RxJava优势:具有响应式编程的该有的特性;为异步而生,无需手动创建线程,并具备线程切换的能力;支持链式调用,保证代码的简洁性;各种操作符,功能非常强大,满足各种业务需求;简化了异步的处理。

RxJava的使用场景:网络请求,数据库的读写,文件读写,定时任务等各种耗时的操作需要通过异步来完成的都可以使用RxJava来完成

RxJava的几个重要概念

观察者(Observer):观察事件变化并处理事件的主要角色,消费者(consumer)也可以理解为一种特殊的观察者

被观察者(Observable):触发事件并决定什么时间发送事件的主要角色(异常和完成也是一种事件)

Observable、Flowable、Single、Completable、Maybe都是被观察者

Flowable是支持背压的一种被观察者

Single、Completable、Maybe是简化版的被观察者

几种被观察者通过toObservable/toFlowable/toSingle/toCompletable/toMaybe

订阅(SubScribe):观察者和被观察者建立关联的操作

2,RxJava中常用操作符

创建操作符: iShot_2023-01-29_10.54.14.png

转换操作符

iShot_2023-01-29_11.18.28.png

map()对被观察者进行处理,把原来发射出来的事件进行处理并产生新的事件,再次创建新的被观察者,发射事件

iShot_2023-01-29_11.27.42.png

flatMap()网络请求中常用的操作符

可以简化代码嵌套太深问题

image.png

iShot_2023-01-29_11.30.05.png

concatMap()和flatMap基本上是一样的

iShot_2023-01-29_11.35.46.png

buffer()

iShot_2023-01-29_11.37.22.png

comPose 实现代码的复用,和SchedulerTransformer一起使用,eg:

微信截图_20230130120209.png

微信截图_20230130120148.png

组合操作符

iShot_2023-01-29_11.52.34.png

concat()针对多个被观察者,会把多个被观察者组合到一个新的被观察者中订阅

功能操作符

微信截图_20230129164404.png

过滤操作符

微信截图_20230129165000.png

3,RxJava中的设计模式

RxJava中的两种设计模式:观察者模式和装饰者模式

观察者模式:实现响应是编程的基础

标准得观察者模式:一个被观察者,多个观察者,并且需要被观察者发生改变通知后,所有得观察者才能观察到

RxJava的观察者模式:一个观察者,多个被观察者,并且需要“起点”和“终点”订阅一次后,才能发出通知,终点(观察者)才能观察到

微信截图_20230129171619.png

微信截图_20230130101431.png

装饰器模式:各种操作符的具体实现类都是通过装饰器模式来扩展完成的

装饰器模式指在不改变现有对象的情况下,动态的给该对象增加一些职责(增加额外的功能)的模式,它属于对象结构性模型

微信截图_20230130095312.png

RxJava中的装饰器模型

微信截图_20230130103650.png

RxJava中概念

ObservableSource:被观察者的顶层接口,提供订阅方法

Observable:被观察者抽象类,实现ObservableSource接口,并提供实际的订阅方法

Observer:观察者接口,提供处理事件的回调方法

ObservableOnSubscribe:被观察者和事件解耦的接口

Emiiter:事件发射器接口,提供发射事件的方法

ObservableXXX:具体的被观察者实现类,持有ObservableOnSubscribe的引用

XXXEmiiter:事件发射器的具体实现类,持有观察者的引用

XXXObserver:观察者的具体实现类

4,RxJava的核心原理

RxJava的设计框架: 抽象流的概念:链式构建流,subScribeActual订阅流,观察者回调流 事件流是从左向右的:把每一个观察者看成一个节点,节点左侧代表上游,节点右侧代表下游

Observable和Observer订阅时序图 image.png

微信截图_20230130103904.png

链式构建流 从左到右可以看成用来构建整个事件序列 RxJava使用了装饰器模式,所以每个被观察者都是基于左侧上一个被观察者的,也就是持有上游被观察者的引用 每次创建新的被观察者,也会创建新的观察者,而这个观察者也会持有下游观察者的引用

微信截图_20230130113212.png

订阅流

微信截图_20230130113604.png

观察者回调流(事件回调流)

微信截图_20230130114301.png

5,RxJava中内存泄漏问题

RxJava中使用的线程有耗时操作,页面已经关闭了,事件还没有处理完,进而导致内存泄漏,在页面销毁后,Observable仍然还有事件等待发送和处理,这时候会导致Activity的回收失败,导致内存泄漏

解决RxJava内存泄漏问题的方式主要是在页面关闭之前取消所有的订阅

使用Disposable,关闭页面时调用Disposable取消订阅

使用compositeDisposable,添加一组Disposable,在关闭页面时同时取消订阅

RxJava中的Subject

同时代表一个观察者和被观察者,允许将单个源多播到多个子观察者

RxJava提供四种SubJect

AsyncSubject:无论发射多少条数据,无论是在订阅前发射还是订阅后发射,都只会收到最后一条的发射数据

BehaviorSubject:只会接收到订阅前最后一条发射的数据以及订阅之后所有的数据

ReplaySubject:会接收全部数据,无论订阅前后

PublishSubject:之后接收订阅之后的所有数据