gpt4 book ai didi

android - 如何使用 Retrofit 进行多次调用?

转载 作者:搜寻专家 更新时间:2023-11-01 07:42:47 25 4
gpt4 key购买 nike

我需要使用 Retrofit 多次调用 API REST 并在 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() 和同样的问题我想在 ListView 中显示此响应,但它不起作用。

最佳答案

首先你需要了解Retrofit的Call#enqueue()之间的区别和 Call#execute()方法。

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

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

在您的情况下,您正在使用 for 循环在一段中执行多个请求。

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

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

我建议您使用 RxAndroidRxJava而不是使用 for 循环。有很多关于这个主题的教程。

引用以下 StackOverflow 问题来解决您的问题。

  1. How to make multiple request and wait until data is come from all the requests in Retrofit 2.0 - Android?
  2. Asynchronous vs synchronous execution, what does it really mean?

根据您的要求调整代码。

祝你好运!

关于android - 如何使用 Retrofit 进行多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52101253/

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