少年啊,要永远相信美好的事情即将发生
RxJava是什么?是ReactiveX的一种Java实现。
那,ReactiveX又是什么,我来与君言。
ReactiveX 是 Reactive Extensions的缩写,一般简写为Rx,就这?确实就这。但是微软给出的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ(Language Integrated Query)风格查询操作符来编写异步和基于事件的程序。开发者可以利用Observables 表示异步数据流,用LINQ操作符查询异步数据流,用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ +Schedulers
啊?这这这。定义总是这么抽象,记住Rx是可观察,能异步处理数据流程序的函数库就行了
大家平时开发中很多场景会用到异步操作,在Android中,我们会用到AsyncTask和Handler,或者创建callback来回调,但是随着请求的数量越来越多,代码逻辑会变得复杂,对阅读代码人来说就是一种“回调地狱”。通过使用RxJava仍旧能保持清晰的逻辑。RxJava的原理是创建一个Observable对象来“干活”,然后使用各种操作符建立起来的链式操作,就如流水线一样,如德芙一样丝滑,把你想要处理的数据一步一步地加工成你想要的成品,之后发送给Subscriber处理(哟,介么帅)。
RxJava的异步操作是通过扩展的观察者模式来实现的。
在RxJava中,Observable代表了被观察者,Observer代表了观察者,在RxJava 3.x中有以下几个被观察者
什么是背压?
背压指的是,在异步场景中,被观察者发送事件的速度远快于观察者处理事件速度的情况下,一种告知上游的被观察者降低发送速度的策略。
从RxJava 2 开始,Observable不再支持背压,而是新增了被观察者Flowable支持背压。Flowable中的操作符和Observable类似,其所有的操作符均强制支持背压。
以RxJava3为例,引入依赖
implementation("io.reactivex.rxjava3:rxandroid:3.0.0")
implementation("io.reactivex.rxjava3:rxjava:3.0.0")
其中,RxAndroid是RxJava在Android平台的扩展,它包含了一些能够简化Android开发的工具。
RxJava的基本用法分为3个步骤
它决定事件触发的时候将有怎样的行为,代码如下所示
val observer = object : Observer {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "onSubscribe d ${d.isDisposed} ")
}
override fun onError(e: Throwable) {
Log.e(TAG, "onError e $e ")
}
override fun onComplete() {
Log.e(TAG, "onComplete")
}
override fun onNext(t: String) {
Log.e(TAG, "onNext t: $t")
}
}
它决定什么时候触发事件以及触发怎样的事件,RxJava使用create方法来创建一个Observable,并为它定义事件触发规则,代码如下所示:
/**
* 基本创建方式
*/
val observable = Observable.create { emitter ->
emitter.onNext("新年快乐")
emitter.onNext("龙年吉祥")
emitter.onComplete()
}
通过调用subscribe的方法,不断地将事件添加到任务队列中,也可用just方法来实现:
/**
* 通过 just 创建
*/
val observable2 = Observable.just("你好","我是保安队长")
订阅只需要一行代码就可以了,如下所示:
observable.subscribe(observer)
通过create创建,输出日志如下:
onSubscribe d false
onNext t: 新年快乐
onNext t: 龙年吉祥
onComplete
通过just创建,输出日志如下:
onSubscribe d false
onNext t: 你好
onNext t: 我是保安队长
onComplete
两种方式都是一样,先调用onSubscribe方法,接着调用两个onNext方法,最后调用onComplete方法。