我遇到的问题是这个.我需要向服务器执行几个请求.每个下一个请求都取决于前一个请求的结果.它们看起来像这样(缩写):
Observable<FileUploadResponse> obsFile = api.uploadFile();
Observable<TokenCreateResponse> obsCreateToken = api.createToken();
Observable<PaymentResponse> obsPayment = api.submitOrder();
Run Code Online (Sandbox Code Playgroud)
我使用flatMap创建了一个observable,它返回PaymentResponse对象,如果不满足某些要求,则发出onError().这工作正常,我在一次通话中完成了所有请求.
问题是我无法在这些请求之间更新UI.使用当前设置,我会在请求开始时显示加载,并在所有请求完成时隐藏它.有没有办法在这些请求之间更新UI?
我想要的是:1.文件上传 - 在UI上写一条消息.2.创建令牌 - 在UI上编写消息.3.提交订单 - 在UI上写一条消息.4.完成所有操作后,隐藏进度对话框.
我的理解是在每个API调用完成后使用onNext()发出一些Observable,然后在完成所有API调用后调用onComplete().但是我该怎么做?
Jah*_*old 10
你可以用doOnNext和实现这个目标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;
}
Run Code Online (Sandbox Code Playgroud)
然后,当您进行上传工作时,只需每次都将值发送给主题:
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))
Run Code Online (Sandbox Code Playgroud)
然后您可以订阅Subject并更新您的UI:
model.getStatusStream()
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(
status -> {
view().setMessage(status);
},
Throwable.printStackTrace
);
Run Code Online (Sandbox Code Playgroud)
或者,根据您希望如何构建应用程序,您可以doOnNext每次调用更新视图调用.您可能需要observeOn每次都使用在主线程和后台线程之间切换.
| 归档时间: |
|
| 查看次数: |
2654 次 |
| 最近记录: |