更新:
我最终找到了解决并行请求列表的正常方法。
只需使用 flatMap、merge、zip、任何组合 rx 运算符。
我们唯一需要特别做的就是对每个请求使用 .subscribeOn(Schedulers.io()) 。所有其他事情,发送并行请求或同时发送将由 rxjava 完美安排。
如果你想看看效果,请尝试以下操作:
private void runMyTest() {
List<Single<String>> singleObservableList = new ArrayList<>();
singleObservableList.add(getSingleObservable(500, "AAA"));
singleObservableList.add(getSingleObservable(300, "BBB"));
singleObservableList.add(getSingleObservable(100, "CCC"));
Single.merge(singleObservableList)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(System.out::println); }
private Single<String> getSingleObservable(long waitMilliSeconds, String name) {
return Single
.create((SingleOnSubscribe<String>) e -> {
try {
Thread.sleep(waitMilliSeconds);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
System.out.println("name = " +name+ ", waitMilliSeconds = " +waitMilliSeconds+ ", thread name = "
+Thread.currentThread().getName()+ ", id =" +Thread.currentThread().getId());
if(!e.isDisposed()) e.onSuccess(name);
})
.subscribeOn(Schedulers.io()); }
输出:
System.out:名称 = CCC,waitMilliSeconds = 100,线程名称 =
RxCachedThreadScheduler-4, id =463
System.out: CCC
System.out:名称 = BBB,waitMilliSeconds = 300,线程名称 =
RxCachedThreadScheduler-3, id =462
System.out: BBB
System.out:名称 = AAA,waitMilliSeconds = 500,线程名称 =
RxCachedThreadScheduler-2, id =461
System.out:AAA
// ******以前的答案但不准确************//
使用这个;解决了我的问题:
zip(java.lang.Iterable<? extends Observable<?>> ws,FuncN<? extends R> zipFunction) method.
一个样本:
public Observable<CombinedData> getCombinedObservables() {
List<Observable> observableList = new ArrayList<>();
observableList.add(observable1);
observableList.add(observable2);
observableList.add(observable3);
observableList.add(observable4);
return Observable.zip(observableList, new Function<Object[], CombinedData>() {
@Override
public CombinedData apply(Object[] objects) throws Exception {
return new CombinedData(...);
}
});
}