Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在RxJava 2和Android中延迟onError()?_Android_Kotlin_Delay_Rx Java2 - Fatal编程技术网

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

如何在RxJava 2和Android中延迟onError()?,android,kotlin,delay,rx-java2,Android,Kotlin,Delay,Rx Java2,我正在尝试从应用程序中的web服务器加载一些数据。由于操作的异步性质,无法提前知道完成操作需要多长时间。为了提醒用户操作正在进行中,我正在使用加载指示器 这是使用kotlin和RxJava2提出的一个解决方案(我希望清楚): fun loadData(){ showLoader()//显示加载指示器 Single.fromCallable{ //http请求逻辑在这里 }.延迟(1000,时间单位.毫秒) .subscribeOn(Schedulers.io()) .observeOn(Andr

我正在尝试从应用程序中的web服务器加载一些数据。由于操作的异步性质,无法提前知道完成操作需要多长时间。为了提醒用户操作正在进行中,我正在使用加载指示器

这是使用kotlin和RxJava2提出的一个解决方案(我希望清楚):

fun loadData(){
showLoader()//显示加载指示器
Single.fromCallable{
//http请求逻辑在这里
}.延迟(1000,时间单位.毫秒)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(对象:DisposableSingleObserver(){
成功时覆盖乐趣(数据:字符串){
//做点什么
hideLoader()//成功时,隐藏指示器
}
覆盖有趣的错误(e:可丢弃){
displayErrorMessage()
hideLoader()//在错误隐藏指示器上
}
})
}
我想显示加载指示器至少1秒,所以我使用了
delay()
操作符,但问题是如果操作成功,它会按预期工作,但如果出现错误,指示器将立即消失,而不是1秒后


有没有办法让
onError()
方法在1秒后执行?谢谢

因为您的工作是在后台线程中完成的,所以您可以在不冻结ui的情况下休眠它:

SystemClock.sleep(1000)

在调用
hideLoader()
call

之前写上这句话,多亏了
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
            }
       )
}

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

好主意,但这不是
delay()
应该做的吗?在delay的文档中,它说返回一个可观测值,延迟源可观测源的发射。因此它延迟发射,而不是执行。根据我的理解,在延迟发射开始之前,理论上你的代码可能会失败。你能不能只使用
可观察的计时器(1,TimeUnit.SECONDS)。switchMapSingle{Single.fromCallable{/…}}
?mcassino谢谢你,这工作非常好。不可能直接在单曲上应用
timer()
操作符,而不是先将其转换为可观察的吗?您可以:)我认为Single.timer()然后map()也是一种有效的方法。
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
            }
       )
}