私は非同期呼び出しを行っています.10秒後に1分間、つまり約6回の呼び出しが行われますが、問題はdelay
特定のものに適用したいcondition
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);