io.reactivex.rxjava2:rxjava:2.1.13
kotlin_version = '1.2.30'
У меня есть следующий Observable, и я пытаюсь создать исключение, чтобы проверить захват исключения в OnError. Однако, когда я передаю onExceptionResumeNext(Observable.just(10)) следующее, я получаю следующий результат:
1
2
10
onComplete
fun main(args: Array<String>) {
Observable.fromArray(1, 2, 0, 4, 5, 6)
.doOnNext {
if (it == 0) {
throw RuntimeException("Exception on 0")
}
}
.onExceptionResumeNext(Observable.just(10))
.subscribe(
{
println(it)
},
{
println("onError ${it.message}")
},
{
println("onComplete")
} )
}
Однако, если я передаю лямбда-выражение этому методу, я получаю следующий результат:
1
2
Observable.fromArray(1, 2, 0, 4, 5, 6)
.doOnNext {
if (it == 0) {
throw RuntimeException("Exception on 0")
}
}
.onExceptionResumeNext { Observable.just(10) }
.subscribe(
{
println(it)
},
{
println("onError ${it.message}")
},
{
println("onComplete")
} )
}
Просто интересно, в чем разница между этим onExceptionResumeNext(Observable.just(10)) и этим onExceptionResumeNext { Observable.just(10) }?
Спасибо заранее





в первом случае вы передаете наблюдаемое в onExceptionResumeNext
в случае ошибки в исходном наблюдаемом вы будете повторно подписаны на наблюдаемый объект, который передается в onExceptionResumeNext
вот почему вы получаете «1» и «2» из исходного источника, а затем «10» и «onComplete» из Observable.just(10)
во втором случае вы используете лямбда-синтаксис, поэтому вы эффективно делаете это:
.onExceptionResumeNext(object : ObservableSource {
void subscribe(@NonNull Observer<? super T> observer) {
Observable.just(10)
}
})
Как видите, переданный вам observer не подписывается. Таким образом, после "1" и "2" из исходного источника ничего не выводится.
то, что ты должен делать, это
.onExceptionResumeNext { observer ->
Observable.just(10).subscribe(observer)
}