android - 如何使用 Retrofit 拨打多个电话?
问题描述
我需要使用 Retrofit 多次调用 API REST 并在 a 中显示响应ListView
,但我不知道如何执行此操作,并且此代码不起作用。
模型
@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()
同样的问题,我想在 a 中显示此响应,ListView
但它不起作用。
解决方案
首先,您需要了解 RetrofitCall#enqueue()
和Call#execute()
方法之间的区别。
enqueue()
方法是异步的,这意味着您可以在完成之前继续执行另一个任务execute()
方法是同步的,这意味着您等待它完成,然后再继续执行另一个任务。
在您的情况下,您正在使用for
循环一次执行多个请求。
现在,如果你使用 for 循环执行网络操作,网络操作将不会停止 for 循环进入下一次迭代。不要期望 API在下一次迭代进入 for 循环之前总是以足够快的方式响应。这是个坏主意。
如果您使用 Retrofit 的execute()
方法,它将不允许您继续下一行(或迭代)作为其同步行为,而且它会抛出NetworkOnMainThreadException
和IOException
. 因此,您需要将请求包装在 AsyncTask 中并处理IOException
。
我建议您将RxAndroid与RxJava一起使用,而不是使用 for 循环。有很多关于这个主题的教程。
请参阅以下 StackOverflow 问题来解决您的问题。
根据您的要求调整代码。
祝你好运!
推荐阅读
- google-sheets - 带有标签而不是数字的 Google 电子表格 GeoChart
- java - 使用java中的for每个循环打印类成员,其实例存储在Class类型的LinkedList中
- python - 从终端获取输出并将其写入文件 FileNotFoundError: [Errno 2] No such file or directory error found in python
- ios - 操纵杆的额外半圆线
- apache-nifi - 如何在 Apache Druid 中将嵌套数据转换为扁平数据
- spring - 为什么在实现基本身份验证时需要身份验证提供程序?春季安全
- html - 徽标图像未推到导航的左上角
- asp.net-mvc-5 - 如何在 module-zero-template 中为 Web api 自定义 OAuthBearerAuthentication
- java - 如果 outputStream.close() 失败,流仍然会被关闭,系统资源仍然会被释放?
- python - tkinter 笔记本小部件框架限制