通过具体的示例,学习每个操作符的用法~
1.OnErrorResumeNext ⭐️
OnErrorResumeNext操作符返回一个备用的Observable,当原Observable调用onError时,OnErrorResueNext操作符将开始从备用的Observable发送事件。
示例:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
emitter.onNext(1)
emitter.onNext(2)
emitter.onError(IllegalArgumentException())
emitter.onNext(3)
emitter.onComplete()
}
}).onErrorResumeNext(object : Function<Throwable, ObservableSource<Int>> {
override fun apply(t: Throwable): ObservableSource<Int> {
return Observable.just(404)
}
})
.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---------")
}
})
输出结果:
2022-11-27 20:40:18.589 E/ErrorOperator: ---------onSubscribe---------
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------1-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------2-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------404-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onComplete---------
2.OnErrorReturn
当原Observable调用onError时,onErrorReturn/onErrorReturnItem不会将该错误传播给下游观测者,而是会发出指定的项并调用观测者的onCompleted方法。
示例:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
emitter.onNext(1)
emitter.onNext(2)
emitter.onError(IllegalArgumentException())
emitter.onNext(3)
emitter.onComplete()
}
}).onErrorReturn(object : Function<Throwable, Int> {
override fun apply(t: Throwable): Int {
return 500
}
})
.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---------")
}
})
输出结果:
2022-11-27 20:40:18.589 E/ErrorOperator: ---------onSubscribe---------
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------1-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------2-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onNext--------404-
2022-11-27 20:40:18.590 E/ErrorOperator: ---------onComplete---------
示例2:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
emitter.onNext(1)
emitter.onNext(2)
emitter.onError(IllegalArgumentException())
emitter.onNext(3)
emitter.onComplete()
}
})
.onErrorReturnItem(400)
.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---------")
}
})
输出结果:
2022-11-27 21:27:51.613 E/ErrorOperator: ---------onSubscribe---------
2022-11-27 21:27:51.613 E/ErrorOperator: ---------onNext--------1-
2022-11-27 21:27:51.613 E/ErrorOperator: ---------onNext--------2-
2022-11-27 21:27:51.613 E/ErrorOperator: ---------onNext--------400-
2022-11-27 21:27:51.613 E/ErrorOperator: ---------onComplete--------
3.Retry ⭐️
如果源Observable发出错误,请重新订阅它,希望它能无错误地完成。
示例:
Observable.create(object : ObservableOnSubscribe<Int> {
override fun subscribe(emitter: ObservableEmitter<Int>) {
emitter.onNext(1)
emitter.onNext(2)
emitter.onError(IllegalArgumentException())
emitter.onNext(3)
emitter.onComplete()
}
})
.retry(object : BiPredicate<Int, Throwable> {
override fun test(times: Int, throwable: Throwable): Boolean {
if (times > 2) {
return false
}
return true
}
})
.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---------")
}
})
输出结果:
2022-11-27 21:40:23.221 E/ErrorOperator: ---------onSubscribe---------
2022-11-27 21:40:23.222 E/ErrorOperator: ---------onNext--------1-
2022-11-27 21:40:23.222 E/ErrorOperator: ---------onNext--------2-
2022-11-27 21:40:23.222 E/ErrorOperator: ---------onNext--------1-
2022-11-27 21:40:23.222 E/ErrorOperator: ---------onNext--------2-
2022-11-27 21:40:23.222 E/ErrorOperator: ---------onNext--------1-
2022-11-27 21:40:23.223 E/ErrorOperator: ---------onNext--------2-
2022-11-27 21:40:23.223 E/ErrorOperator: ---------onError---------