首页 > 解决方案 > 如何使用 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但它不起作用。

标签: androidretrofit2

解决方案


首先,您需要了解 RetrofitCall#enqueue()Call#execute()方法之间的区别。

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

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

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

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

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

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

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

  1. 如何发出多个请求并等待数据来自 Retrofit 2.0 - Android 中的所有请求?
  2. 异步与同步执行,它的真正含义是什么?

根据您的要求调整代码。

祝你好运!


推荐阅读