通过具体的示例,学习每个操作符的用法~
1.Delay
Delay操作符修改源Observable,在发出源Observable的每个项目之前暂停特定的时间增量。使Observable发出的整个项目序列在时间上向前移动指定的增量。
示例:
Observable.just(1, 2, 3)
.delay(2, TimeUnit.SECONDS)
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
执行结果:
从订阅到onNext接收到事件,中间间隔了2S。
2023-01-08 15:47:47.081 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 15:47:49.083 E/UtilityOperator: ---------onNext--------1-
2023-01-08 15:47:49.083 E/UtilityOperator: ---------onNext--------2-
2023-01-08 15:47:49.083 E/UtilityOperator: ---------onNext--------3-
2023-01-08 15:47:49.083 E/UtilityOperator: ---------onComplete---------
2.Do ⭐⭐⭐
通过Do操作符注册将在Observable上发生某些事件时调用的回调,其中这些回调将独立于与Observable级联关联的正常通知集进行调用。do操作符调用优先于正常的通知事件。
示例:
Observable.just(1, 2, 3)
.doOnEach {
Log.e(TAG, "---------doOnEach-------${it.value}--")
}
.doOnNext {
Log.e(TAG, "---------doOnNext-------${it}--")
}
.doOnSubscribe {
Log.e(TAG, "---------doOnSubscribe--------")
}
.doOnComplete {
Log.e(TAG, "---------doOnComplete--------")
}
.doOnError {
Log.e(TAG, "---------doOnError--------")
}
.doOnTerminate {
Log.e(TAG, "---------doOnTerminate--------")
}
.doFinally {
Log.e(TAG, "---------doFinally--------")
}
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 15:50:56.708 E/UtilityOperator: ---------doOnSubscribe--------
2023-01-08 15:50:56.708 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnEach-------1--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnNext-------1--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------onNext--------1-
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnEach-------2--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnNext-------2--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------onNext--------2-
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnEach-------3--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnNext-------3--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------onNext--------3-
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnEach-------null--
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnComplete--------
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doOnTerminate--------
2023-01-08 15:50:56.709 E/UtilityOperator: ---------onComplete---------
2023-01-08 15:50:56.709 E/UtilityOperator: ---------doFinally--------
3.Materialize/Dematerialize
Material将源Observable的通知转换为Notification对象,并将其作为返回的Observable发出的通知。
Dematerialize逆转了这个过程:将源Observable中发出的Notification对象转换为结果Observable的通知。
示例:
Observable.just(1, 2, 3)
.materialize()
.flatMap {it->
//it是Notification<Int>
Observable.just(it)
}
.dematerialize {
it
}
.flatMap {it->
//it是Int
Observable.just(it)
}
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}-----")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 16:09:37.336 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 16:09:37.336 E/UtilityOperator: ---------onNext--------1-----
2023-01-08 16:09:37.336 E/UtilityOperator: ---------onNext--------2-----
2023-01-08 16:09:37.337 E/UtilityOperator: ---------onNext--------3-----
2023-01-08 16:09:37.337 E/UtilityOperator: ---------onComplete---------
4.SubscribeOn/ObserveOn ⭐⭐⭐
ObserveOn和SubscribeOn操作符可以用于实现Rxjava上下游线程切换。
SubscribeOn:指定Observable将在哪个线程上开始操作。SubscribeOn这个操作符,与调用的位置无关,而且只有第一次调用时会指定Observable自己在哪个调度器执行。
ObserveOn:指定Observable应在哪个线程上调用其观察者的onNext、onCompleted和onError方法。ObservableOn操作符可以多次调用,调用后Map和Subscribe操作符都会发生在指定的调度器中,实现了线程的切换。
示例:
Observable.just(1, 2, 3)
.subscribeOn(Schedulers.io())//指定Observable在Io线程执行
.observeOn(Schedulers.newThread())//切换新的线程
.map {
Log.e(TAG, "---------map1-----$it-----${Thread.currentThread().name}--")
it * 2
}
.observeOn(Schedulers.newThread())//切换新的线程
.map {
Log.e(TAG, "---------map2-----$it-----${Thread.currentThread().name}--")
it/2
}
.observeOn(AndroidSchedulers.mainThread())//切换Android主线程中监听回调,方便更新UI
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}----${Thread.currentThread().name}-")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 16:32:27.975 E/UtilityOperator: ------onSubscribe---------
2023-01-08 16:32:27.977 E/UtilityOperator: ------map1-----1-----RxNewThreadScheduler-1--
2023-01-08 16:32:27.978 E/UtilityOperator: ------map1-----2-----RxNewThreadScheduler-1--
2023-01-08 16:32:27.978 E/UtilityOperator: ------map1-----3-----RxNewThreadScheduler-1--
2023-01-08 16:32:27.979 E/UtilityOperator: ------map2-----2-----RxNewThreadScheduler-2--
2023-01-08 16:32:27.979 E/UtilityOperator: ------onNext--------1----main-
2023-01-08 16:32:27.979 E/UtilityOperator: ------map2-----4-----RxNewThreadScheduler-2--
2023-01-08 16:32:27.979 E/UtilityOperator: ------onNext--------2----main-
2023-01-08 16:32:27.979 E/UtilityOperator: ------map2-----6-----RxNewThreadScheduler-2--
2023-01-08 16:32:27.979 E/UtilityOperator: ------onNext--------3----main-
2023-01-08 16:32:27.979 E/UtilityOperator: ------onComplete---------
5.TimeInterval
TimeInterval运算符将源Observable进行转换,为每个发射添加连续发射之间经过的时间量的指示。其中第一次发射的时间量是从观测者订阅Observable到源Observable发射其第一个项目所经过的时间。最后一次发射的时间量是从最后一次发射到调用onCompleted之间的时间间隔。
示例:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
for (index in 3..7) {
try {
Thread.sleep(1000)
} catch (e: Exception) {
e.printStackTrace()
}
emitter.onNext(index)
}
emitter.onComplete()
}
})
.timeInterval()
.subscribe(object : Observer<Timed<Int>> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Timed<Int>) {
Log.e(TAG, "---------onNext--------${t.value()}-------${t.time()}-------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 16:39:34.747 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 16:39:35.748 E/UtilityOperator: ---------onNext--------3-------1001-------
2023-01-08 16:39:36.749 E/UtilityOperator: ---------onNext--------4-------1001-------
2023-01-08 16:39:37.750 E/UtilityOperator: ---------onNext--------5-------1001-------
2023-01-08 16:39:38.751 E/UtilityOperator: ---------onNext--------6-------1001-------
2023-01-08 16:39:39.752 E/UtilityOperator: ---------onNext--------7-------1000-------
2023-01-08 16:39:39.752 E/UtilityOperator: ---------onComplete---------
6.Timeout
如果Observable在指定的时间段内未能发出任何项目,则Timeout运算符允许您使用onError终止中止该Observable。
timeout(long,TimeUnit,Observable)
第一个参数:时长
第二个参数:时间单位
第三个参数:备选Observable,当原Observable因超时被终止时,会切换到此备选Observable继续发送事件。
示例:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
for (index in 0..5) {
try {
Thread.sleep(index * 1000L)
} catch (e: Exception) {
e.printStackTrace()
}
emitter.onNext(index)
}
emitter.onComplete()
}
})
.timeout(2000, TimeUnit.MILLISECONDS, Observable.just(100, 200))
.subscribe(object : Observer<Int> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Int) {
Log.e(TAG, "---------onNext--------${t}---------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 16:54:18.950 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 16:54:18.951 E/UtilityOperator: ---------onNext--------0---------
2023-01-08 16:54:19.952 E/UtilityOperator: ---------onNext--------1---------
2023-01-08 16:54:21.954 E/UtilityOperator: ---------onNext--------100---------
2023-01-08 16:54:21.954 E/UtilityOperator: ---------onNext--------200---------
2023-01-08 16:54:21.954 E/UtilityOperator: ---------onComplete---------
7.Timestamp
为Observable发出的每个项目附加一个时间戳,指示其发出的时间。
示例:
Observable.just(1, 2, 3)
.timestamp()
.subscribe(object : Observer<Timed<Int>> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: Timed<Int>) {
Log.e(TAG, "---------onNext--------${t.value()}------${t.time()}---")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 17:14:17.353 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 17:14:17.353 E/UtilityOperator: ---------onNext--------1------1673169257353---
2023-01-08 17:14:17.353 E/UtilityOperator: ---------onNext--------2------1673169257353---
2023-01-08 17:14:17.353 E/UtilityOperator: ---------onNext--------3------1673169257353---
2023-01-08 17:14:17.353 E/UtilityOperator: ---------onComplete---------
8.Using
Using操作符将使用observableFactory函数创建Observble,同时Using操作符使用resourceFactory函数创建资源。当观察者取消订阅Observable时,或者当Observable终止时(正常或出现错误),Using操作符将调用disposeFunction来处理它创建的资源。如下图:
示例:
Observable.using(object : Supplier<Int> { //resourceFactory
override fun get(): Int {
Log.e(TAG, "---resourceFactory------get()---------")
return Random().nextInt(100)
}
}, object : Function<Int, Observable<String>> { //observableFactory
override fun apply(t: Int): Observable<String> {
Log.e(TAG, "--observableFactory-------apply()---------")
return Observable.just("-apply--$t--")
}
}, object : Consumer<Int> { //disposeFunction
override fun accept(t: Int) {
Log.e(TAG, "---disposeFunction------accept()---------")
}
}).subscribe(object : Observer<String> {
override fun onSubscribe(d: Disposable) {
Log.e(TAG, "---------onSubscribe---------")
}
override fun onNext(t: String) {
Log.e(TAG, "---------onNext--------${t}-------")
}
override fun onError(e: Throwable) {
Log.e(TAG, "---------onError---------")
}
override fun onComplete() {
Log.e(TAG, "---------onComplete---------")
}
})
输出结果:
2023-01-08 17:49:36.724 E/UtilityOperator: ---resourceFactory------get()---------
2023-01-08 17:49:36.724 E/UtilityOperator: --observableFactory-------apply()---------
2023-01-08 17:49:36.725 E/UtilityOperator: ---------onSubscribe---------
2023-01-08 17:49:36.725 E/UtilityOperator: ---------onNext---------apply--92---------
2023-01-08 17:49:36.725 E/UtilityOperator: ---disposeFunction------accept()---------
2023-01-08 17:49:36.725 E/UtilityOperator: ---------onComplete---------