改造 2
众所周知,Retrofit 可以同步和异步执行请求。
同步方法在主线程上执行。这意味着在请求执行期间 UI 会阻塞,并且在此期间无法进行交互。
对于非阻塞 UI,您必须自己在单独的线程中处理请求执行。这意味着,您仍然可以在等待响应时与应用程序本身进行交互。
在 Retrofit2 中,如果你想同步执行请求:
同步请求
public interface TaskService {
@GET("/tasks")
Call<List<Task>> getTasks();
}
从同步请求中获取结果
//service generator
TaskService taskService = ServiceGenerator.createService(TaskService.class);
Call<List<Task>> call = taskService.getTasks();
List<Task>> tasks = call.execute().body();
但是如果你想异步执行请求:
异步请求
public interface TaskService {
@GET("/tasks")
Call<List<Task>> getTasks();
}
从异步请求中获取结果
//service generator
TaskService taskService = ServiceGenerator.createService(TaskService.class);
Call<List<Task>> call = taskService.getTasks();
call.enqueue(new Callback<List<Task>>() {
@Override
public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {
if (response.isSuccessful()) {
// tasks available
} else {
// error response, no access to resource?
}
}
@Override
public void onFailure(Call<List<Task>> call, Throwable t) {
// something went completely south (like no internet connection)
Log.d("Error", t.getMessage());
}
}
如前所述: Retrofit 2 中的接口定义对于同步和异步请求是相同的。换句话说,在 Retrofit 2 中,每个请求都被包装到一个 Call 对象中。实际的同步或异步请求在稍后创建的调用对象上使用所需的方法以不同方式执行。
- 用于
call.execute()
同步运行。
- 用于
call.enqeue()
异步运行。