我遇到的问题是这个。我需要向服务器执行几个请求。每个下一个请求都取决于前一个请求的结果。 它们看起来像这样(缩写):
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()。但是我该怎么做呢?
答案 0 :(得分:10)
您可以使用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
调用更新视图调用。您可能需要使用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;之间切换。背景线程每次。