Кажется, что вы пытаетесь свести к минимуму свой шаблон, используя для вызова общую функцию, но есть лучший способ сделать это.
Сначала вы инкапсулируете настройку модернизации с помощью:
@POST("{urlEndPoint}")
<C, T> Call<C> request(@Body T body, @Path("urlEndPoint") String urlEndPoint);
И затем вызываете ее с созданной вами функцией:
request.rest(App.object1, "endpoint");
Но на самом деле это только усложнит ситуацию, и код будет очень тесно связан.Вам все равно нужно будет вызывать один и тот же метод для всех различных API (request.rest(App.object2, "endpoint2")
, request.rest(App.object3, "endpoint3")
).Это также ограничивает возможности модификации (, например, несколько параметров, настройка заголовков и т. Д. ).Что вы можете сделать, это просто выполнить настройку дооснащения:
@POST("yourendpoint")
Call<YourObjectResp> saveObject(@Body YourObjectParam param)
И чтобы свести к минимуму ваш шаблон, я предлагаю сделать его функциональным :
Call<YourObjectResp> call = apiService.saveObject(new YourObjectParam());
call.enqueue(new ApiServiceOperator<>(new
ApiServiceOperator.OnResponseListener<YourObjectResp>() {
@Override
public void onSuccess(YourObjectResp body) {
// do something with your response object
}
@Override
public void onFailure(Throwable t) {
// here, you can create another java class to handle the exceptions
}
}));
А для вашего ApiServiceOperator.java
:
/**
* Handles retrofit framework response.
* Extract the body if success, otherwise throw an exception.
*/
public class ApiServiceOperator<T> implements Callback<T> {
interface OnResponseListener<T> {
void onSuccess(T body);
void onFailure(Throwable t);
}
private OnResponseListener<T> onResponseListener;
public ApiServiceOperator(OnResponseListener<T> onResponseListener) {
this.onResponseListener = onResponseListener;
}
@Override
public void onResponse(@NonNull Call<T> call, @NonNull Response<T> response) {
if (response.isSuccessful()) { // here, do the extraction of body
onResponseListener.onSuccess(response.body());
} else {
onResponseListener.onFailure(new ServerErrorException());
}
}
@Override
public void onFailure(@NonNull Call<T> call, @NonNull Throwable t) {
onResponseListener.onFailure(new ConnectionErrorException());
}
// these exception can be on a separate classes.
public static class ServerErrorException extends Exception {
}
public static class ConnectionErrorException extends Exception {
}
}
С этими настройками вы по-прежнему минимизируете свой шаблон, а также он делает вещь многоразовой, масштабируемой и тестируемой.ApiServiceOperator
также свободно соединяется с Android Context
и вместо этого выдает простое исключение Java, в котором вы можете создать функцию, которая знает Android Context
, чтобы получить соответствующую базу сообщений при выданном исключении.