如何使用翻新功能拨打多个电话?

时间:2018-08-30 16:02:24

标签: android retrofit2

我需要使用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中显示此响应,但是它不起作用。

1 个答案:

答案 0 :(得分:2)

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

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

  2. execute()方法是 Synchronous ,这意味着您需要等待它完成才可以继续执行其他任务。

在您的情况下,您正在使用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?

根据您的要求调整代码。

祝你好运!