RxJava3 辅助操作符

本文通过示例详细介绍了RxJava中的几个关键操作符,包括Delay在事件发出前的延迟功能,Do操作符注册的回调处理,Materialize/Dematerialize用于转换Observable的通知,以及SubscribeOn和ObserveOn用于线程切换的操作。此外,还讨论了TimeInterval记录发射间时间、Timeout处理超时和Timestamp添加时间戳的功能。
摘要由CSDN通过智能技术生成

通过具体的示例,学习每个操作符的用法~

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---------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值