我需要使用 Retrofit 多次调用 API REST 并在ListView
,但我不知道如何执行此操作,并且此代码不起作用。
Model
@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
但它不起作用。
首先你需要了解Retrofit之间的区别Call#enqueue() https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#enqueue-retrofit2.Callback- and Call#execute() https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#execute--方法。
enqueue()
方法是异步这意味着您可以在完成之前继续执行另一项任务
execute()
方法是同步这意味着,您需要等待它完成才能继续执行另一项任务。
在你的情况下,你正在使用for
循环在一次拉伸中执行多个请求。
现在,如果使用for循环执行网络操作,网络操作将不会停止for循环进入下一次迭代。不要期望 API 会always在进入 for 循环下一次迭代之前以足够快的方式响应。这是个坏主意。
如果你使用Retrofit的execute()
方法,它不会允许您继续下一行(或迭代)作为其同步行为,而且它会抛出NetworkOnMainThreadException
and IOException
。因此,您需要将请求包装在 AsyncTask 中并处理IOException
.
我建议你使用接收Android https://github.com/ReactiveX/RxAndroid with RxJava https://github.com/ReactiveX/RxJava而不是使用 for 循环。关于这个主题有很多教程。
请参阅以下 StackOverflow 问题来解决您的问题。
- 如何在Retrofit 2.0 - Android中发出多个请求并等待所有请求都有数据? https://stackoverflow.com/q/36474120/5180017
- 异步执行与同步执行的真正含义是什么? https://stackoverflow.com/q/748175/5180017
根据您的要求调整代码。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)