Задать вопрос
@JZX

Как обработать ошибку в switchMap?

Есть 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 произошла ошибка.
  • Вопрос задан
  • 68 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Что ещё за Single<String> или Single<Exception>? Это же дичь. Сделай так: репозиторий пускай возвращает Single<Result>.
sealed class Result {
    data class Success(result: String): Result()
    data class Error(exception: Exception): Result()
}


Пара замечаний:
1. Сабжект тут не нужен, в com.jakewharton.rxbinding2:rxbinding-kotlin есть для этого нормальный extension textChanges()
2. Нужно минимизировать мутирование внешнего стейта из rx-цепочки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы