我正在尝试从我的应用程序中的 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<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
            }
       )
}

我希望这会帮助某人。

关于android - 如何在 RxJava 2 和 Android 中延迟 onError()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47596951/

10-12 03:20