gpt4 book ai didi

java - 如何使用 RxJava 重复网络调用

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:38 25 4
gpt4 key购买 nike

我有一个 API,可以让我使用类似这样的 id 检索项目:

http://myapi.com/api/v1/item/1

其中最后一个值是项目的 ID。这很好,花花公子,我可以编写一个 Retrofit 服务接口(interface)并像这样调用该项目:

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);
}
});

我遇到的问题是我想一次检索 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...

这将并行运行您的请求,您的订阅 block 将分别接收每个元素。


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 - 如何使用 RxJava 重复网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com