【发布时间】:2016-11-14 22:55:20
【问题描述】:
我正在进行异步调用,10 秒后 1 分钟,这意味着将进行大约 6 次调用,但问题在于我希望它在特定的 condition 上应用 delay
Observable
.just(listOfSomethings_Locally)
.take(1, TimeUnit.MINUTES)
.serialize()
.delaySubscription( // this is confusing part
() ->
Observable.just(listOfItems_Network).take(10,TimeUnit.SECONDS)
)
我想要的是将网络呼叫延迟 10 秒,第一次呼叫除外,并在 10 秒后取消网络呼叫,所以我应该在 1 分钟内有准确的 6 个呼叫。
编辑
由于场景混乱,这里重新定义场景:
我有大量本地驱动程序,我想发送 每 10 秒后向他们每个人发出请求,然后听另一个 订户检查司机是否在 10 秒内取消了它, 这个过程将持续大约 1 分钟,如果一个司机取消我应该 立即向下一个发送请求
到目前为止编写的代码:
Observable.from(driversGot)
.take(1,TimeUnit.MINUTES)
.serialize()
.map(this::requestRydeObservable) // requesting for single driver from driversGot (it's a network call)
.flatMap(dif ->
Observable.amb(
kh.getFCM().driverCanceledRyde(), // listen for if driver cancel request returns integer
kh.getFCM().userRydeAccepted()) // listen for driver accept returns RydeAccepted object
.map(o -> {
if (o instanceof Integer) {
return new RydeAccepted();
} else if (o instanceof RydeAccepted) {
return (RydeAccepted) o;
}
return null;
}).delaySubscription(10,TimeUnit.SECONDS)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(fua -> {
if (fua == null) {
UiHelpers.showToast(context, "Invalid Firebase response");
} else if (!fua.getStatus()) { // ryde is canceled because object is empty
UiHelpers.showToast(context, "User canceled ryde");
} else { // ryde is accepted
UiHelpers.showToast(context, "User accepted ryde");
}
}, t -> {
t.printStackTrace();
UiHelpers.showToast(context,"Error sending driver requests");
}, UiHelpers::stopLoading);
【问题讨论】:
-
请提供有关您的可观察对象和用例的更多详细信息。据我了解您的更新:您有一个项目列表,它将被转换为一个 Observable。您想一次处理一个元素,该元素已推送给您。必须在每 10 秒内为您安排一次值。示例:Sec 0:值 1,Sec 10:值 2。每个发出的值都将通过网络调用进行处理。如果该项目在 10 秒内被取消,你检查另一个 obs。如果不是,一个元素的过程将是 60 秒。如果在 10 秒内取消,你会开始排队的下一个吗?
-
您完全了解流程,除了 60 秒是列表中所有元素的总体限制时间
-
那么,您的列表中有 6 个元素,或者如果您每 10 秒调度一个元素,您希望如何在 60 秒内完成?
-
每个元素都有 10 秒的报价,但可以在其中取消,因此下一个元素应立即安排
-
好的,知道了。能否请您提供一些关于 driverCanceledRyde、userRydeAccepted、requestRydeObservable、fua 的实现细节(返回类型)
标签: android multithreading rx-java rx-android rx-java2