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

Dan*_*íaz 2 android retrofit2

我需要使用Retrofit多次调用API REST,并在中显示响应ListView,但我不知道该怎么做,因此此代码不起作用。

模型

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

实作

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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*nth 5

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

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

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

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

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

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

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

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

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

根据您的要求调整代码。

祝好运!