Предыстория. Итак, у меня довольно большой проект с множеством функций API. Думаю полностью перейти на сопрограммы, но так как они реализованы как Callback а не Deferred, то не могу их эффективно использовать. Например: я хотел бы сделать apiCallOne(), apiCallTwo() и apiCallThree() асинхронным и вызвать .await(), чтобы дождаться завершения последнего запроса перед изменением пользовательского интерфейса.
Сейчас проект устроен так:
В самом низу (или вверху) находится 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 объектов? (Я хочу создать для этого еще один класс-оболочку)