我有一個模擬長時間運行過程的睡眠方法。如何讓這個rxjava zip並行運行?
private void sleep() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
然後我有一個方法返回一個Observable,其中包含參數中給出的2個字符串的列表。它在返回字符串之前調用睡眠。
private Observable<List<String>> getStrings(final String str1, final String str2) {
return Observable.fromCallable(new Callable<List<String>>() {
@Override
public List<String> call() {
sleep();
List<String> strings = new ArrayList<>();
strings.add(str1);
strings.add(str2);
return strings;
}
});
}
然後我打電話的getStrings在Observalb.zip三次,我期望這三個電話並行運行,因此執行的總時間應2秒或可能在3秒內大部分是因爲睡眠只有2秒。但是,它總共需要六個秒。 如何讓它平行運行,以便在2秒內完成?
Observable
.zip(getStrings("One", "Two"), getStrings("Three", "Four"), getStrings("Five", "Six"), mergeStringLists())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<String> strings) {
//Display the strings
}
});
的mergeStringLists方法
private Func3<List<String>, List<String>, List<String>, List<String>> mergeStringLists() {
return new Func3<List<String>, List<String>, List<String>, List<String>>() {
@Override
public List<String> call(List<String> strings, List<String> strings2, List<String> strings3) {
Log.d(TAG, "...");
for (String s : strings2) {
strings.add(s);
}
for (String s : strings3) {
strings.add(s);
}
return strings;
}
};
}
'Schedulers.io()'是默認情況下是根據需要增長的線程池。 –
@TassosBassoukos你的意思是Schedulers.io()會根據需要自動創建新線程? –
@Bartek你的解決方案工作,你知道是否有任何其他解決方案比你的解壓縮並行運行? –