我有一个API,可让我使用如下所示的ID来检索商品:
http://myapi.com/api/v1/item/1
最后一个值是项目的ID.很好,很花哨,我可以编写一个Retrofit服务接口,并调用如下所示的项:
MyService service = MyService.retrofit.create(MyService.class);
service.itemById(1)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Item>() {
@Override
public void onCompleted() {
}
@Override
public void one rror(Throwable e) {
Log.v(LOG_TAG, e.getMessage());
}
@Override
public void onNext(Item item) {
adapter.addItem(item);
}
});
我遇到的问题是我想一次检索5个项目,但是我不知道该怎么做.例如,如果我想获取ID为1、2、3、4、5的物品,我该如何在一组中做到这一点?我已经研究了Observable.zip(),但是我不太清楚如何设置它.
解决方法:
如果要使用zip,则需要执行以下操作(为简洁起见,使用lambda语法):
Observable.zip(
service.itemById(1),
service.itemById(2),
service.itemById(3),
service.itemById(4),
service.itemById(5),
(i1, i2, i3, i4, i5) -> new Tuple<>(i1, i2, i3, i4, i5))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
tuple -> {
// < use the tuple >
},
error -> {
// ...
}
);
注意:您必须创建一个Tuple类或其他对象,或者导入一个Tuple库.
根据您的评论的另一种变化:
Observable.range(1, 5)
.flatMap(t -> service.itemById(t), (i, response) -> new Tuple<>(i, response))
.subscribeOn(Schedulers.io())
.subscribe...
这将并行运行您的请求,并且您的订阅块将分别接收每个元素.
Observable.range(1, 5)
.flatMap(t -> service.itemById(t), (i, response) -> new Tuple<>(i, response))
.collect(ArrayList::new, ArrayList::add)
.subscribeOn(Schedulers.io())
.subscribe...
这将把结果元组收集到一个数组中.