あなたの両方のAPIがタイプTの放出を持つObservableを返すと仮定すると、最初のステップはこれらの観測値を変更してタイムアウトになるようにします。 amb
とTimer
機能を使用してこれを行うことができます。
Observable<T> apiCall1WithTimeout = Observable.amb(apiCall1(),
Observable.Timer(500, TimeUnit.MILLISECONDS)
.flatmap(l -> Observable.error(new Exception("Api1 timed out")));
Observable<T> apiCall2WithTimeout = Observable.amb(apiCall2(),
Observable.Timer(500, TimeUnit.MILLISECONDS)
.flatmap(l -> Observable.error(new Exception("Api2 timed out"))));
第2のステップは、オブザーバブルをさらに変更して、別のスレッドで作業するようにすることです。これはsubscribeOn
オペレータ
Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread());
Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread());
最後のステップは、あなたの観測からの排出量をマージすることですが、あなたはどのタイムアウトエラーが最後に放出することにしたい、幸運にもmergeDelayError
オペレータはちょうどそのよう
Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);
を行うを使用して行われます
鮮やかな、まさに私が欲しかったことです、ありがとうございます。 –