【发布时间】:2019-09-01 18:10:50
【问题描述】:
背景:所以,我有一个相当大的项目,其中包含很多 API 函数。我正在考虑完全转向协程,但由于它们被实现为Callback 而不是Deferred,我无法有效地使用它们。例如:我想做apiCallOne()、apiCallTwo()和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 和 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 对象? (我愿意为此创建另一个包装类)
【问题讨论】:
标签: android kotlin coroutine kotlin-coroutines