Я использую RxKotlin для создания своего последнего приложения для Android, и я столкнулся со знакомой проблемой: как обрабатывать сетевые ошибки в стиле Rx.
У меня настроен поток для условий поиска против TextView
, например:
searchBar
.queryTextObservable()
.debounce(500, TimeUnit.MILLISECONDS)
.map { it.trim() }
.filter { it.isNotBlank() }
.observeOn(Schedulers.io())
Это полезный способ прослушивания изменений при вводе текста, поэтому я затем расширяю код для подачи подготовленного текста в сетевой запрос (используя библиотеку Retrofit с расширением RxJava) для поиска по:
searchBar
.queryTextObservable()
.debounce(500, TimeUnit.MILLISECONDS)
.map { it.trim() }
.filter { it.isNotBlank() }
.observeOn(Schedulers.io())
.switchMap { search(it) }
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(...)
Проблема возникает при сетевой ошибке - вся моя подписка отменяется. Похоже, у меня есть несколько вариантов для управления сбоем, но ни один из них не выглядит очень чистым:
- Иметь внутреннюю наблюдаемую после завершения ввода текста, которая делает сетевой запрос
- Используйте
onErrorResumeNext
и передайте дозорное значение
Это, очевидно, не является исчерпывающим, но каковы подходящие шаблоны для изящной обработки сетевых ошибок при сохранении потока (и, следовательно, полезности) пользовательского ввода из панели поиска?