如何使用RxJava重复网络通话

我有一个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...

这将把结果元组收集到一个数组中.

上一篇:java-Retrofit对象返回为null


下一篇:java-如何使用Retrofit2动态设置超时?