gpt4 book ai didi

android - RxJava - 链接请求和更新 UI

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:10 24 4
gpt4 key购买 nike

我遇到的问题是这样的。我需要对服务器执行几个请求。每个下一个请求都取决于前一个请求的结果。它们看起来像这样(缩写):

Observable<FileUploadResponse> obsFile = api.uploadFile();
Observable<TokenCreateResponse> obsCreateToken = api.createToken();
Observable<PaymentResponse> obsPayment = api.submitOrder();

我使用 flatMap 创建了一个单独的可观察对象,它返回 PaymentResponse 对象,或者在不满足某些要求时发出 onError() 。这工作正常,我在一次调用中完成了所有请求。

问题是我无法在这些请求之间更新 UI。使用当前设置,我在请求开始时显示加载并在所有请求完成时隐藏它。有没有办法在这些请求之间更新用户界面?

我想要的是:1. 文件上传 - 在 UI 上写一条消息。2. 创建 token - 在 UI 上写一条消息。3.提交订单-在用户界面上写一条消息。4. 全部完成后,隐藏进度对话框。

我的理解是当每个 API 调用完成时使用 onNext() 发出一些 Observable,然后在所有完成时调用 onComplete()。但我该怎么做呢?

最佳答案

您可以使用 doOnNextPublishSubject 来实现。首先创建一个主题和一些值:

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 并更新您的 UI:

model.getStatusStream()
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(
status -> {
view().setMessage(status);
},
Throwable.printStackTrace
);

或者,根据您想要构建应用程序的方式,您可以每次都从 doOnNext 调用更新 View 调用。您可能每次都需要使用 observeOn 在主线程和后台线程之间切换。

关于android - RxJava - 链接请求和更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42654209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com