背景:所以,我有一个相当大的项目,有很多 API 函数。我正在考虑完全转向协程,但由于它们的实现方式是Callback
并不是Deferred
,我无法有效地使用它们。例如:我想做apiCallOne()
, apiCallTwo()
and apiCallThree()
异步和调用.await()
等到最后一个请求完成后再更改 UI。
现在该项目的结构如下:
最底部(或顶部)是ApiService.java
:
interface ApiService {
@GET("...")
Call<Object> getData();
...
}
然后我有一个ClientBase.java
:
功能createRequest()
是解析改造响应的主要功能。
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
and 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
物体? (我愿意为此创建另一个包装类)