gpt4 book ai didi

java - 使用 RxJava + Retrofit 对列表中的每一项进行 API 请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:48 24 4
gpt4 key购买 nike

我试图通过将多个改造 API 调用链接在一起来创建一个可观察对象。步骤是:

  1. 使用 api 调用获取 json 对象列表
  2. 对于列表中的每个对象,进行另一个 api 调用以获取有关该项目的更多详细信息
  3. 将从这个新的详细对象中获取的数据写入磁盘上的文件(列表中的每个项目都会发生这种情况)
  4. 最后返回一个单独对象的可观察对象,该对象需要为之前的每个对象创建一个文件

这是我目前所拥有的:

public static Observable<DownloadedFiles> downloadFiles() {
DownloadedFiles downloadedFiles = new DownloadedFiles();
Observable.create(subscriber -> {
return getRestService().getObjectList()
.flatMapIterable(objects -> objects)
.flatMap(objectLimited -> getRestService().getObject(objectLimited.getPath()))
.doOnNext(objectFull -> {

try {
File file = new File();
// Extract data from objectFull and write new file to disk
// ...
} catch (IOException e) {
subscriber.onError(e);
}

downloadedFiles.putFile(file);
})
.toList()
.map(objects -> downloadedFiles)
.finallyDo(() -> {
subscriber.onNext(downloadedFiles);
subscriber.onCompleted();
});
});
}

@GET("/api/...")
Observable<List<Object>> getObjectList();

@GET("/api/.../{path}")
Observable<Object> getObject(@Path("path") String path);

有人可以确认我使用了正确的运算符吗?谢谢。

最佳答案

编辑:删除了 Observable.create,retrofit 已经为您制作了一个 observable,您只需要对其进行转换。

编辑 2:您也不需要对 subscriber.onError 做任何事情,如果抛出错误,它将自行调用 subscriber.onError。

非常好,不知道为什么要使用 flatmap observable。我宁愿对 Observable::from 进行平面映射,也值得添加 collect。基本上我要将 1 事物映射到许多事物,然后执行一些操作,将许多事物收集回一个事物,然后在我收集完所有发出的项目后订阅那个事物。

public static Observable<DownloadedFiles> downloadFiles() {        
return getRestService().getObjectList()
.flatMap(Observable::from)
.flatMap(objectLimited -> getRestService().getObject(objectLimited.getPath()))
.doOnNext(objectFull -> {
try {
File file = new File();
// Extract data from objectFull and write new file to disk
// ...
} catch (IOException e) {
new IOException(e);
}})
.collect(() -> new DownloadFiles<>(), (files, object) -> { files.add(object});

关于java - 使用 RxJava + Retrofit 对列表中的每一项进行 API 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732119/

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