RxJava - 链接请求和更新UI

Tom*_*cic 8 android rx-java

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

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每次都使用在主线程和后台线程之间切换.