我需要使用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
中显示此响应,但是它不起作用。
答案 0 :(得分:2)
首先,您需要了解Retrofit的Call#enqueue()
和Call#execute()
方法之间的区别。
enqueue()
方法是异步,这意味着您可以在完成另一个任务之前继续进行
execute()
方法是 Synchronous ,这意味着您需要等待它完成才可以继续执行其他任务。
在您的情况下,您正在使用for
循环来一次执行多个请求。
现在,如果使用for循环执行网络操作,则网络操作不会停止for循环进入下一个迭代。不要指望API将以足够快的方式始终响应,然后再进行下一次迭代的for循环。那是个坏主意。
如果您使用Retrofit的execute()
方法,由于它的同步行为,它将不允许您继续下一行(或迭代),并且会抛出NetworkOnMainThreadException
和IOException
。因此,您需要将请求包装在AsyncTask中并处理IOException
。
我建议您将RxAndroid与RxJava一起使用,而不要使用for循环。关于此主题有很多教程。
请参考以下StackOverflow问题以解决您的问题。
根据您的要求调整代码。
祝你好运!