apiCallOne()
,apiCallTwo()
和 apiCallThree()
,并调用 .await()
等待最后一个请求完成后再更改UI。
现在项目结构如下:
在最底部(或顶部)是 ApiService.java
:
interface ApiService {
@GET("...")
Call<Object> getData();
...
}
接下来,我有一个名为ClientBase.java
的文件:
函数createRequest()
是解析Retrofit响应的主要函数。
void getUserName(String name, ApiCallback<ApiResponse<...>> callback) {
createRequest(ApiService.getData(...), new ApiCallback<ApiResponse<?>>() {
@Override
public void onResult(ServiceResponse response) {
callback.onResult(response);
}
});
}
private void createRequest(Call call, final ApiCallback<ApiResponse<?>> callback) {
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, retrofit2.Response response) {
//heavy parsing
}
// return request results wrapped into ApiResponse object
callback.onResult(new ApiResponse<>(...));
}
@Override
public void onFailure(Call call, Throwable t) {
// return request results wrapped into ApiResponse object
callback.onResult(...);
}
});
}
ApiCallback
和ApiResponse
看起来是这样的:
public interface ApiCallback<T> {
void onResult(T response);
}
public class ApiResponse<T> {
private T mResult;
private ServiceError mError;
...
}
在此之前,我还有一个 ApiClient.java
文件,其中使用了 ClientBase.createRequest()
方法:
public void getUserName(String name, ApiCallback<ApiResponse<..>> callback) {
ClientBase.getUserName(secret, username, new ServiceCallback<ServiceResponse<RegistrationInvite>>() {
@Override
public void onResult(ServiceResponse<RegistrationInvite> response) {
...
callback.onResult(response);
}
});
}
正如你看到的那样,这非常非常糟糕。我该如何转移一些代码,至少确保ApiClient.java
函数返回Deferred
对象?(我愿意为此创建另一个封装类)