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中常用操作符
创建操作符:
转换操作符
map()对被观察者进行处理,把原来发射出来的事件进行处理并产生新的事件,再次创建新的被观察者,发射事件
flatMap()网络请求中常用的操作符
可以简化代码嵌套太深问题
concatMap()和flatMap基本上是一样的
buffer()
comPose 实现代码的复用,和SchedulerTransformer一起使用,eg:
组合操作符
concat()针对多个被观察者,会把多个被观察者组合到一个新的被观察者中订阅
功能操作符
过滤操作符
3,RxJava中的设计模式
RxJava中的两种设计模式:观察者模式和装饰者模式
观察者模式:实现响应是编程的基础
标准得观察者模式:一个被观察者,多个观察者,并且需要被观察者发生改变通知后,所有得观察者才能观察到
RxJava的观察者模式:一个观察者,多个被观察者,并且需要“起点”和“终点”订阅一次后,才能发出通知,终点(观察者)才能观察到
装饰器模式:各种操作符的具体实现类都是通过装饰器模式来扩展完成的
装饰器模式指在不改变现有对象的情况下,动态的给该对象增加一些职责(增加额外的功能)的模式,它属于对象结构性模型
RxJava中的装饰器模型
RxJava中概念
ObservableSource:被观察者的顶层接口,提供订阅方法
Observable:被观察者抽象类,实现ObservableSource接口,并提供实际的订阅方法
Observer:观察者接口,提供处理事件的回调方法
ObservableOnSubscribe:被观察者和事件解耦的接口
Emiiter:事件发射器接口,提供发射事件的方法
ObservableXXX:具体的被观察者实现类,持有ObservableOnSubscribe的引用
XXXEmiiter:事件发射器的具体实现类,持有观察者的引用
XXXObserver:观察者的具体实现类
4,RxJava的核心原理
RxJava的设计框架: 抽象流的概念:链式构建流,subScribeActual订阅流,观察者回调流 事件流是从左向右的:把每一个观察者看成一个节点,节点左侧代表上游,节点右侧代表下游
Observable和Observer订阅时序图
链式构建流 从左到右可以看成用来构建整个事件序列 RxJava使用了装饰器模式,所以每个被观察者都是基于左侧上一个被观察者的,也就是持有上游被观察者的引用 每次创建新的被观察者,也会创建新的观察者,而这个观察者也会持有下游观察者的引用
订阅流
观察者回调流(事件回调流)
5,RxJava中内存泄漏问题
RxJava中使用的线程有耗时操作,页面已经关闭了,事件还没有处理完,进而导致内存泄漏,在页面销毁后,Observable仍然还有事件等待发送和处理,这时候会导致Activity的回收失败,导致内存泄漏
解决RxJava内存泄漏问题的方式主要是在页面关闭之前取消所有的订阅
使用Disposable,关闭页面时调用Disposable取消订阅
使用compositeDisposable,添加一组Disposable,在关闭页面时同时取消订阅
RxJava中的Subject
同时代表一个观察者和被观察者,允许将单个源多播到多个子观察者
RxJava提供四种SubJect
AsyncSubject:无论发射多少条数据,无论是在订阅前发射还是订阅后发射,都只会收到最后一条的发射数据
BehaviorSubject:只会接收到订阅前最后一条发射的数据以及订阅之后所有的数据
ReplaySubject:会接收全部数据,无论订阅前后
PublishSubject:之后接收订阅之后的所有数据