如何使用Retrofit进行多个通话?

2024-02-03

我需要使用 Retrofit 多次调用 API REST 并在ListView,但我不知道如何执行此操作,并且此代码不起作用。

Model

@GET("apks/{sha256}")
    Call<DatoAPI> getTask2(@Path("sha256") String hash, @Query("Authorization") String key);

执行

for (String s: hash) {                                          
    Call<DatoAPI> call = services.getTask2(s, API.API_KEY);
    call.enqueue(new Callback<DatoAPI>() {
        @Override
        public void onResponse(Call<DatoAPI> call, Response<DatoAPI> response) {
            if (response.isSuccessful()) {
                datoAPI = response.body();
                items.add(datoAPI.getApp());
            }
        }

        @Override
        public void onFailure(Call<DatoAPI> call, Throwable t) {
            Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_LONG).show();
        }
    });
}

我也尝试过call.execute()和同样的问题 我想在ListView但它不起作用。


首先你需要了解Retrofit之间的区别Call#enqueue() https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#enqueue-retrofit2.Callback- and Call#execute() https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#execute--方法。

  1. enqueue()方法是异步这意味着您可以在完成之前继续执行另一项任务

  2. execute()方法是同步这意味着,您需要等待它完成才能继续执行另一项任务。

在你的情况下,你正在使用for循环在一次拉伸中执行多个请求。

现在,如果使用for循环执行网络操作,网络操作将不会停止for循环进入下一次迭代。不要期望 API 会always在进入 for 循环下一次迭代之前以足够快的方式响应。这是个坏主意。

如果你使用Retrofit的execute()方法,它不会允许您继续下一行(或迭代)作为其同步行为,而且它会抛出NetworkOnMainThreadException and IOException。因此,您需要将请求包装在 AsyncTask 中并处理IOException.

我建议你使用接收Android https://github.com/ReactiveX/RxAndroid with RxJava https://github.com/ReactiveX/RxJava而不是使用 for 循环。关于这个主题有很多教程。

请参阅以下 StackOverflow 问题来解决您的问题。

  1. 如何在Retrofit 2.0 - Android中发出多个请求并等待所有请求都有数据? https://stackoverflow.com/q/36474120/5180017
  2. 异步执行与同步执行的真正含义是什么? https://stackoverflow.com/q/748175/5180017

根据您的要求调整代码。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Retrofit进行多个通话? 的相关文章

随机推荐

  • ActiveMQ从java中删除队列

    如何从java程序中删除activemq中的队列 有类似 session delelteQueue 的东西吗 谢谢M 简单的解决方案 不使用 JMX 将连接转换为 ActiveMQConnection 并使用其 destroyDestina
  • 寻求报告服务认证建议

    我被分配负责修订当前的报告服务验证流程 目的是保持必要的安全级别 并简化授予对各个报告的访问权限的维护 配置 我无权访问域控制器来修改或创建新的 AD 组 我必须与当前存在的组 用户合作 在身份验证方面 我似乎可以选择使用以下任一方法 Wi
  • -Webkit滚动条+溢出+JQuery滚动顶部始终返回零

    我一整天都在研究这个错误 但无法解决它 有一个 JQuery scrollTop 动画脚本 它检测 window scrollTop 值并执行一些动画 如果单击按钮滚动回顶部 this click 函数 html body animate
  • C 中的守护进程 - 有没有一种方法可以实现它们?

    我有一个关于 C 中守护进程的一般性问题 但到目前为止我还没有看到答案 有没有一种方法可以实现对守护进程的控制 例如约定或标准 休息是进一步的解释 我看过多个文档 教授如何在 C 中创建守护进程的基础知识 分叉 关闭文件描述符 更改根目录等
  • 下载文件存储位置和处理使用selenium webdriver和JAVA下载弹出窗口

    请提出一个想法 并进行以下几点实施 1 how to handle the Download popup in IE with Selenium Webdriver with JAVA 2 如何使用JAVA将该xml文件存储在不同的位置 注
  • “响应?”与“响应缺失?”

    定义的意义何在respond to missing 而不是定义respond to 如果重新定义会出现什么问题respond to 某堂课 Without respond to missing http ruby doc org core
  • bash - 导出不起作用

    我错过了一些非常基本的东西 在 Mac OS X 下 我尝试过 chmod 0777 setdir bsh 一定是我的设置有问题 bin bash export proj Users RParadox projects testprojec
  • JButton 文本的抗锯齿

    我在用着字体真棒 http fortawesome github io Font Awesome icon arrow circle left 在 JButton 中创建可单击的图标 但是当尺寸较小时 生成的图标会出现别名 只是作为一点背景
  • 架构 x86_64 的 1 个重复符号

    我不确定我做错了什么 我将项目文件夹移动到另一个文件夹 并将备份文件夹复制到桌面 我尝试打开备份项目并构建 但收到链接器错误 因此 我决定删除备份文件夹并将项目文件夹移回桌面 我无法再编译并收到以下错误 Showing Recent Iss
  • 生成图像的 Base64 字符串以在数据 URI 中使用

    如何生成图像的 Base64 字符串以在数据 URI 中使用 我有一个 Base64 图像编码问题 希望有人可以帮助解决 我正在尝试在我的网页中使用数据 uri 即 img src with org apache commons codec
  • 滞后函数获取最后一个不同的值(redshift)

    我有如下示例数据 想要获得所需的 O P 请帮我一些想法 我希望第 3 4 行的 prev diff value 的 o p 为2015 01 01 00 00 00代替2015 01 02 00 00 00 with dat as sel
  • 如何为所有 div 的每一侧提供相同的空间

    您好 我有一个关于布局的问题 我有一个网站 我在 div 中填充信息 这些 Div 需要彼此相邻 它们之间以及容器 div 两侧之间的空间大小相同 我正在为手机制作它 所以我不知道屏幕的宽度 它应该在所有不同的屏幕分辨率上看起来都很好 目前
  • 使用 Ninject 工厂方法将 IEnumerable 注入到构造函数中

    我正在尝试注入IEnumerable使用 Ninject 进入构造函数 我的构造函数如下所示 public MatrixViewModel IEnumerable
  • 我怎样才能对我的整个 git 历史记录进行 clang 格式?

    我现在已经完成了我的一个小图书馆 当我开始使用它时 我不知道 clang format 现在我想用它格式化整个存储库 我知道随着提交哈希值的变化 这会破坏其他人的存储库 然而 由于还没有人使用我的图书馆 这对我来说没问题 因此 我必须做什么
  • 基于 NetBeans 平台构建的 Web Start 应用程序不会创建桌面快捷方式和开始菜单项

    我创建了一个使用 Java Web Start 启动的 NetBeans 平台应用程序 我使用 Netbeans 6 8 中的 Build JNLP Application 命令构建了 WAR 文件 我已将桌面快捷方式和菜单项添加到 JNL
  • 在 PLINQ 中绑定源线程

    我有一个使用 PLINQ 并行化的计算 如下所示 Source IEnumerable
  • Link rel="canonical":不同的用户指南版本是否应该使用相同的规范 URL? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否应该使用 2 个不同版本的用户指南不同的规范 URL 文档版本1 1 0 Final 文档版本1 2 0 Final 或者应该使用 2 个不
  • 使用 JDBC 的标准当前时间函数

    当我们使用 JPA 和 JPQL 时 我们可以使用一些日期 时间表达式 http www objectdb com java jpa query jpql date这使得查询 DMBS 独立 例如 假设我想在数据库中设置会话的结束时间 我可
  • 使用 R 将时间格式转换为数字

    在大多数情况下 我们使用 R 将数字时间转换为 POSIXct 格式 但是 如果我们想比较两个时间点 那么我们更喜欢数字时间格式 例如 我的日期格式类似于 2001 03 13 10 31 00 begin lt 2001 03 13 10
  • 如何使用Retrofit进行多个通话?

    我需要使用 Retrofit 多次调用 API REST 并在ListView 但我不知道如何执行此操作 并且此代码不起作用 Model GET apks sha256 Call