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