我需要使用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但它不起作用。
首先,您需要了解Retrofit Call#enqueue()和Call#execute()方法之间的区别。
enqueue()方法是异步的,这意味着您可以在完成另一个任务之前继续进行
execute()方法是同步的,这意味着您需要等待它完成才能继续执行其他任务。
在您的情况下,您将使用for循环在单个段中执行多个请求。
现在,如果使用for循环执行网络操作,则网络操作不会停止循环进入下一个迭代。不要期望API 在下一次迭代进行for循环之前总是会以足够快的方式响应。那是个坏主意。
如果您使用Retrofit的execute()方法,则将不允许您继续下一行(或迭代),因为它具有“同步”行为,并且会引发NetworkOnMainThreadException和IOException。因此,您需要将请求包装在AsyncTask中并处理IOException。
我建议您将RxAndroid与RxJava一起使用,而不要使用for循环。关于此主题有很多教程。
请参考以下StackOverflow问题以解决您的问题。
根据您的要求调整代码。
祝好运!
| 归档时间: |
|
| 查看次数: |
3405 次 |
| 最近记录: |