我知道这段代码是反模式,但我怎么能正确编写它。你能帮助我吗?如果web api在2秒内没有响应,我想打开ProgressDialog。当你回答时,关闭它。
getCompositeDisposable().add(mRemoteUseCase.sendData(profileInfo)
.subscribeOn(scheduler)
.observeOn(androidSchedulers)
.doOnSubscribe(s ->
{
mIsLoading.set(true);
Observable.timer(2000, TimeUnit.MILLISECONDS).take(1).subscribeOn(scheduler)
.observeOn(androidSchedulers).doOnNext(c -> {
if (mIsLoading.get() && isShowProgressDialog) {
progressDialog.show();
}
}).subscribe(l -> {
});
})
.doAfterTerminate(() -> {
mIsLoading.set(false);
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
})
.subscribe(new Consumer<RemoteResponse<UserData>>() {
@Override
public void accept(RemoteResponse<UserData> remoteResponse) throws Exception {
dataManager.setProfile(profile);
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
listener.onError(throwable);
dialog = DialogFactory.createSimpleOkErrorDialog(context, "Error");
dialog.show();
}
})
);
答案 0 :(得分:0)
您可以使用两个observable。第一个将使用.delay()
来显示进度对话框。您将使用第二个来发出请求。如果请求在2秒之前完成 - 请使用.dispose()
取消第一个请求。
这是一个例子(它是Kotlin,但你会明白的):
val dialogObservable = Single.just(true)
.observeOn(Schedulers.computation())
.subscribeOn(AndroidSchedulers.mainThread())
.delay(2, TimeUnit.SECONDS)
.subscribe({
// show dialog
}, {
// do something with the error
})
val startTime = System.currentTimeMillis()
mRemoteUseCase.sendData(profileInfo)
.subscribeOn(scheduler)
.observeOn(androidSchedulers)
.subscribe({
val endTime = System.currentTimeMillis()
if(TimeUnit.MILLISECONDS.toSeconds(endTime - startTime) <= 2){
dialogObservable.dispose()
}
// do something else
}, {
// do something with the error
})