当前位置: 首页 > 面试题库 >

使用RxJava和Retrofit进行N次连续的api调用

太叔英锐
2023-03-14
问题内容

我有一个文件列表,我想从Android设备上传到后端。由于内存的限制,我只想在第一个完成后进行第二个API调用,第二个完成后进行第三个API调用,依此类推。

我写了类似

private Observable<Integer> uploadFiles(List<File> files) {
        return Observable.create(subscriber -> {
            for (int i = 0, size = files.size(); i < size; i++) {
                UploadModel uploadModel = new UploadModel(files.get(0));
                int uploadResult = retrofitApi.uploadSynchronously(uploadModel);
                subscriber.onNext(uploadResult);
            }
            subscriber.onCompleted();
        }).subscribeOn(Schedulers.newThread());
    }

但是我觉得这可能与Rx的精神背道而驰,俗话说,如果您使用的是Observable.create,则可能做错了……这是一种合理的方法吗?通过Retrofit的RxJava集成,是否有更好的方法来实现此目的?


问题答案:

天真地,我会这样做(但是,它不起作用,请参见下文):

return Observable.from(files).concatMap(file -> retrofitApi.upload(uploadModel));

现在的问题是,没有办法告诉改造只使用一个线程进行这些调用。

reduce但是,会将一个函数调用的结果与原始可观察到的下一个发射值一起传递给下一个。那可以工作,但是传递给函数reduce必须是同步的。不好。

另一种方法是递归地修改可观察对象:

void getNextFile(int i) {
    return retrofit.upload(i).
        onNext(result -> getNextFile(i + 1));
}

大致。但是我不确定如何清理它以使其更具可读性。

我认为最干净的是:

Observable.from(files).map(file -> retrofitApi.uploadSynchronously(new UploadModel(file)));


 类似资料:
  • 如何使用RxJava和Kotlin中的改型创建api调用的泛型类? 我的JAVA实现是:: 首先添加Gradle依赖项:(更新到最新版本(如果可用)) //用于改装 实现“com.squareup.reverfit2:reverfit:2.3.0” 实现“com.squareup.reverfit2:converter-gson:2.3.0” //对于拦截器实现“com.squareup.okht

  • 我有以下情况。 我使用以下方法进行ajax调用以加载json数据。 我设置了以下函数来加载json数据 现在,有时这会正确加载,有时第三个JSON调用会从第二个JSON调用加载数据。不确定这是怎么可能的,因为它们有不同的URL,并且它们的响应函数完全不同并且是自包含的。第二个json调用同时获得一条成功消息和一个错误。 这似乎是一个时间问题,因为它有时起作用,但我看不出反应是如何被混淆的。任何帮助

  • 我仍在尝试将RXJava2用于多个订阅者使用的轮询服务。它工作得很好,除了它总是调用两次。 我尝试使用publish(1)、take(1)、share()、refCount()等,但结果总是一样。叫两次或多次。 我还是不明白为什么它叫了两次。新订阅服务器应该接收最新发出的值,并且只在更改后的值(如果hashmap更改了)返回为modified List。 我的民意调查可观察到(单例) 我的谓词用于

  • 本文向大家介绍rx-java 设置Retrofit和RxJava,包括了rx-java 设置Retrofit和RxJava的使用技巧和注意事项,需要的朋友参考一下 示例 Retrofit2带有对多种可插入执行机制的支持,其中一种是RxJava。 要与RxJava一起使用改造,首先需要将Retrofit RxJava适配器添加到您的项目中: 那么在构建改造实例时需要添加适配器: 在您定义API的界面

  • 问题内容: 对于需要刷新以设置的时间间隔呈现给用户的部分数据的简单Web应用程序,仅使用setInterval()从端点获取JSON而不使用适当的轮询框架是否有任何弊端? 出于示例的原因,可以说我每5秒刷新一次处理作业的状态。 问题答案: 根据我的评论: 我将使用 [docs] 并始终在收到上一个响应时调用它。这样,在请求/响应花费的时间超过间隔时间的情况下,可以避免可能的拥塞或函数堆栈或任何您想