我遇到的问题是这样的。我需要向服务器执行几个请求。下一个请求取决于前一个请求的结果。
它们看起来像这样(缩写):
Observable<FileUploadResponse> obsFile = api.uploadFile();
Observable<TokenCreateResponse> obsCreateToken = api.createToken();
Observable<PaymentResponse> obsPayment = api.submitOrder();
我使用 flatMap 创建了一个可观察对象,它返回 PaymentResponse 对象,或者在不满足某些要求时发出 onError() 。这工作正常,我在一次调用中完成了所有请求。
问题是我无法在这些请求之间更新用户界面。使用当前设置,我在请求开始时显示加载,并在所有请求完成时隐藏它。有没有办法在这些请求之间更新 UI?
我想要的是这样的:
1. 文件上传 - 在 UI 上写入消息。
2. 创建令牌 - 在 UI 上写入消息。
3. 提交订单 - 在 UI 上写一条消息。
4. 全部完成后,隐藏进度对话框。
我的理解是,当每个 API 调用完成时,使用 onNext() 发出一些 Observable,然后在所有操作完成后调用 onComplete() 。但我该怎么做呢?
你可以通过以下方式实现这一点doOnNext
and a PublishSubject
。首先创建一个主题和一些值:
public static final int STATUS_UPLOADING = 0;
public static final int STATUS_TOKEN = 1;
public static final int STATUS_SUBMITTING = 2;
public static final int STATUS_DONE = 3;
PublishSubject<Integer> status = PublishSubject.create();
public Observable<Integer> getStatusStream() {
return status;
}
然后,当您进行上传工作时,只需每次将值发送给主题即可:
status.onNext(STATUS_UPLOADING);
return api.uploadFile()
.doOnNext(o -> status.onNext(STATUS_TOKEN))
.flatMap(o -> api.createToken())
.doOnNext(o -> status.onNext(STATUS_SUBMITTING))
.flatMap(o -> api.submitOrder())
.doOnNext(o -> status.onNext(STATUS_DONE))
然后您就可以订阅Subject
并更新你的用户界面:
model.getStatusStream()
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(
status -> {
view().setMessage(status);
},
Throwable.printStackTrace
);
或者,根据您想要构建应用程序的方式,您可以只调用更新视图调用doOnNext
每一次。你可能需要使用observeOn
每次在主线程和后台线程之间切换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)