如何在RxJava 2和Android中延迟onError()?
我正在尝试从应用程序中的web服务器加载一些数据。由于操作的异步性质,无法提前知道完成操作需要多长时间。为了提醒用户操作正在进行中,我正在使用加载指示器 这是使用kotlin和RxJava2提出的一个解决方案(我希望清楚):如何在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
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
}
)
}