如何在RxJava 2和Android中延迟onError()?

我试图从我的应用程序中的Web服务器加载一些数据。 而且由于操作的异步性,无法预先知道需要多长时间才能完成。 为了提醒用户操作“正在进行”,我正在使用一个加载指示器。

这是一个使用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() { 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秒后。

那么是否有一种方法可以在1秒之后执行onError()方法? 谢谢

感谢nacassiano评论,我终于find了一个解决方案:

 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 } ) } 

我希望这会帮助别人。

由于你的工作是在后台完成的,你可以在不冻结用户界面的情况下入睡:

 SystemClock.sleep(1000) 

只需在hideLoader()调用之前放置它hideLoader()