我需要遍历数据列表,获取所有ID,使用这些ID触发网络调用,然后在获得结果列表后执行某些操作(服务器可以获取ID列表并返回结果列表但它现在没有这样的工作方式)。
目前我的工作方式如下:
for (Data data: dataList) {
String id = data.getId();
idObservables.add(dataService.getResultFromNetwork(id));
}
Observable.zip(idObservables, new FuncN<List<Result>>() {
@Override
public List<Result> call(Object... args) {
List<Result> resultList = new ArrayList<>();
for (Object arg : args) {
resultList.add((Result) arg));
}
return resultList;
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Result>>() {
@Override
public void call(List<Result> resultList) {
// Do something with the list of Result
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e("", "error", throwable);
}
});
但显然我对它的做法并不满意。知道在Android中使用RxJava处理这种情况的更好方法会很棒。
干杯!!
答案 0 :(得分:2)
为lambda主义道歉,但它确实使逻辑更容易阅读:
Observable
.fromIterable(dataList)
.flatMap(data ->
dataService
.getResultFromNetwork(data.getId())
.subscribeOn(Schedulers.io())
)
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {
// do something
});
我们的想法是保持Rx-land中的管道;使用普通参数和返回可观察量的简单方法是值得的,复杂的方法需要观察并返回可观察量。
注意:以上不会保留订购;如果你需要一个有序列表,请使用带预取的concatMap。