假设这样一种情况,有一个元素都是id的数组,我们需要用这些id分别获取对应的内容,然后把这些内容再放进一个集合中最后显示在ListView上应该怎么办?如果只是用Retrofit我们需要循环使用这些id来请求,那如果用RxJava是什么样呢?
ApiManger apiManger = RetrofitHelper.getManger();
Observable.from(ids)
.flatMap(id -> apiManger.getInfo(id))
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(infoModels -> {
Logger.e(infoModels.get(1).getData().getTitle());
}, throwable -> Logger.e(throwable.toString()));
我们使用from操作符对id数组进行循环,然后把每个id作为参数再去请求内容,再调用toList把循环请求下来的内容生成一个List。
当然这个id数组同样也可以是从网络请求下来的
ApiManger apiManger = RetrofitHelper.getManger();
apiManger.getIds()
.flatMap(idModel -> Observable.from(idModel.getIds()))
.flatMap(id -> apiManger.getInfo(id))
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(infoModels -> {
Logger.e(infoModels.get(1).getData().getTitle());
}, throwable -> Logger.e(throwable.toString()));
从这里我们也可以看到flatMap的强大。