使用RxJava为多个网络调用创建和处理多个observable的最佳方法

时间:2017-06-06 10:42:01

标签: android rx-java

我需要遍历数据列表,获取所有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处理这种情况的更好方法会很棒。

干杯!!

1 个答案:

答案 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。