gpt4 book ai didi

java - 我怎样才能使这个 rxjava zip 并行运行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:04 26 4
gpt4 key购买 nike

我有一个模拟长时间运行进程的 sleep 方法。

private void sleep() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

然后我有一个方法返回一个包含参数中给定的 2 个字符串列表的 Observable。它在返回字符串之前调用 sleep 。

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;
}
});
}

然后我在 Observalb.zip 中调用 getStrings 三次,我希望这三个调用并行运行,所以执行的总时间应该在 2 秒 或最多 3 秒内因为 sleep 只有2秒。但是,它总共花费了 6 秒。 我怎样才能使它并行运行以在 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;
}
};
}

最佳答案

发生这种情况是因为订阅您的 zipped observable 发生在同一个 io 线程中。

你为什么不试试这个:

Observable
.zip(
getStrings("One", "Two")
.subscribeOn(Schedulers.newThread()),
getStrings("Three", "Four")
.subscribeOn(Schedulers.newThread()),
getStrings("Five", "Six")
.subscribeOn(Schedulers.newThread()),
mergeStringLists())
.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
}
});

如果有帮助请告诉我

关于java - 我怎样才能使这个 rxjava zip 并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com