如何使用RxJava重复网络调用

如何使用RxJava重复网络调用,java,android,retrofit,rx-java,rx-android,Java,Android,Retrofit,Rx Java,Rx Android,我有一个API,它允许我使用如下内容通过id检索项目: http://myapi.com/api/v1/item/1 MyService service = MyService.retrofit.create(MyService.class); service.itemById(1) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io())

我有一个API,它允许我使用如下内容通过id检索项目:

http://myapi.com/api/v1/item/1
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 onError(Throwable e) {
                        Log.v(LOG_TAG, e.getMessage());
                    }

                    @Override
                    public void onNext(Item item) {
                        adapter.addItem(item);
                    }
                });
其中最后一个值是项目的id。这很好,很漂亮,我可以编写一个改装服务界面,并调用如下项目:

http://myapi.com/api/v1/item/1
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 onError(Throwable e) {
                        Log.v(LOG_TAG, e.getMessage());
                    }

                    @Override
                    public void onNext(Item item) {
                        adapter.addItem(item);
                    }
                });
MyService=MyService.reformation.create(MyService.class);
服务.itemById(1)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
Log.v(Log_标记,e.getMessage());
}
@凌驾
公共void onNext(项目){
适配器.附件(项目);
}
});

我遇到的问题是,我想一次检索5个项目,但我不知道如何才能做到这一点。例如,如果我想获取id为1、2、3、4、5的项目,我如何在一个组中进行此操作?我已经研究了
Observable.zip()
,但我不太清楚如何设置它。

如果您想使用zip,您可能需要这样做(为简洁起见,使用lambda语法):

Observable.zip(
服务项目ID(1),
服务项目ID(2),
服务项目ID(3),
服务项目ID(4),
服务项目ID(5),
(i1,i2,i3,i4,i5)->新元组(i1,i2,i3,i4,i5))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.订阅(
元组->{
//<使用元组>
},
错误->{
// ...
}
);
注意:您必须创建一个元组类或其他对象,或者导入一个元组库


根据您的评论,另一个变化是:

Observable.range(1, 5)
    .flatMap(t -> service.itemById(t), (i, response) -> new Tuple<>(i, response))
    .subscribeOn(Schedulers.io())
    .subscribe...
可观测范围(1,5)
.flatMap(t->service.itemById(t),(i,响应)->新元组(i,响应))
.subscribeOn(Schedulers.io())
订阅
这将并行运行您的请求,并且您的订阅块将分别接收每个元素


可观测范围(1,5)
.flatMap(t->service.itemById(t),(i,响应)->新元组(i,响应))
.collect(ArrayList::new,ArrayList::add)
.subscribeOn(Schedulers.io())
订阅

这将在数组中收集生成的元组。

可观察列表=可观察的.range(/…/).map(/…/).toList()

如果我不想硬编码这些值,你会怎么做?假设我想从一个起点开始,然后从那个点开始循环五圈?(如果有意义的话,就像寻呼机一样)谢谢你的编辑!我现在就去试试,你太棒了!我选择了分别接收每个选项的选项,但感谢您添加了另一个选项。肯定会对未来的读者有所帮助。