RxJava - 链接请求和更新UI

时间:2017-03-07 17:10:48

标签: android rx-java

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

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

我使用flatMap创建了一个observable,它返回PaymentResponse对象,或者如果不满足某些要求则发出onError()。这工作正常,我只需一次通话即可完成所有请求。

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

我想要的是: 1.文件上传 - 在UI上写一条消息。 2.创建令牌 - 在UI上编写消息。 3.提交订单 - 在UI上写一条消息。 4.完成所有操作后,隐藏进度对话框。

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

1 个答案:

答案 0 :(得分:10)

您可以使用PublishSubjectpublic 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调用更新视图调用。您可能需要使用do.call(rbind, lapply(split(d, d$TagID), function(a){ #split by 'TagID' and loop over sub-groups a = a[!duplicated(a$Station),] #Retain only the first appearances of 'arrival' a = a[order(a$arrival),] #Sort each sub-group by 'arrival' cbind(TagID = a$TagID[1], #obtain TagID, station, and ttime of the sub-group, Last_Station = a$Station[NROW(a)], ttime = (as.numeric(as.POSIXct(a$arrival[NROW(a)])) - as.numeric(releasetime))/(60*60*24)) } ) ) # TagID Last_Station ttime #[1,] "2059" "MAW" "10.8015046296296" #[2,] "2062" "BCE" "6.60633101851852" #[3,] "2066" "MAW" "7.68387731481481" 在主要和&amp;之间切换。背景线程每次。