Есть subject в который я отправляю символы с EditText.
private val querySubject: BehaviorSubject<String> = BehaviorSubject.create()
Подписываюсь на него следующим образом:
querySubject
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
viewState.showLoading()
currentQuery = it
}
.switchMap {
repository.search(it)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toObservable()
}
.subscribe({
Log.i(TAG, it.toString())
if (currentQuery == EMPTY_STRING) {
_initialData = it
viewState.updateView(Success(null, initialData))
} else {
when {
it.isEmpty() -> {
viewState.updateView(Success(NOTHING_FOUND, it))
}
else -> {
val msg = FOUND_ITEMS_COUNT + it.size.toString()
viewState.updateView(Success(msg, it))
}
}
}
viewState.hideLoading()
}, {
viewState.showError(Error(SERVER_ERROR, it))
viewState.hideLoading()
})
.addTo(disposable)
На данный subject приходит поисковый запрос и в
switchMap вызывается метод репозитория
repository.search(it), который возвращает результат поиска в виде Single с
List<String>
или
Single< Exception>
. Если метод возвращает ошибку, то она по цепи доходит до subscribeBy и на внешнем эмиттере вызывается dispose() и происходит отписка и прекращается реакция на новый ввод в editText. Как можно обработать ошибку такого типа? Пробовал разные способы, но единственное что получилось вызывать onErrorReturnItem(listOf(SEARCH_ERROR)) на цепи метода
repository.search() и возвращать список с единственным элементом (строковой константой SEARCH_ERROR), по которой могу понять что в switchMap произошла ошибка.