Как задержать onError () в RxJava 2 и Android?

Я пытаюсь загрузить некоторые данные с веб-сервера в своем приложении. И из-за асинхронного характера операции невозможно заранее узнать, сколько времени потребуется для завершения. Чтобы предупредить пользователя о том, что операция «выполняется». Я использую индикатор загрузки.

Это придумал использование kotlin и RxJava 2 (надеюсь, это ясно):

fun loadData(){ showLoader() // show loading indicator Single.fromCallable { // http request logic goes here }.delay(1000, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : DisposableSingleObserver<String>() { override fun onSuccess(data: String) { // do something hideLoader() // on success, hide indicator } override fun onError(e: Throwable) { displayErrorMessage() hideLoader() // on error hide indicator } }) } 

Я хочу показать индикатор загрузки не менее 1 секунды, поэтому я использовал оператор delay() , но проблема в том, что это работает, как ожидалось, если операция выполнена успешно, но в случае ошибки индикатор сразу исчезнет не через 1 секунду ,

Итак, можно ли сделать способ onError() выполнить через 1 секунду? благодаря

Благодаря комментарию nacassiano , мне наконец удалось найти решение:

 fun loadData(){ showLoader() // show loading indicator Single.timer(1000, TimeUnit.MILLISECONDS) .flatMap{ Single.fromCallable { // http request logic goes here } }.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy( // this is an extension function from rxkotlin onSuccess = { // do something hideLoader() // on success, hide indicator }, onError = { displayErrorMessage() hideLoader() // on error hide indicator } ) } 

Надеюсь, это поможет кому-то.

Поскольку ваша работа выполняется в фоновом потоке, вы можете просто спать без замораживания ui:

 SystemClock.sleep(1000) 

просто поставьте это перед hideLoader()