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

时间:2017-12-01 15:50:54

标签: android kotlin delay rx-java2

我试图在我的应用程序中从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秒后执行?感谢

3 个答案:

答案 0 :(得分:3)

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

我希望这会对某人有所帮助。

答案 1 :(得分:1)

由于你的工作是在后台线程完成的,你可以在不冻结ui的情况下睡觉它:

SystemClock.sleep(1000)

hideLoader()电话

之前加上这个

答案 2 :(得分:0)

只需调用不同的延迟方法签名

public final Single<T> delay(long time, TimeUnit unit, boolean delayError)

Single.fromCallable {

    // http request logic goes here

}.delay(1000, TimeUnit.MILLISECONDS, true)