Manejo de errores de actualización
Envolví mi código de Retrofit en una clase como la siguiente. Si no está claro del código que estoy publicando, es interactuar con un servicio relajante con OAuth.
¿Cuál sería una buena manera de hacer el manejo de errores? El servidor REST devuelve un mensaje de error en formato json. Me gustaría actuar sobre ese mensaje lanzando algunas excepciones de mi clase. Estoy tratando de hacer algo como a continuación. ¿Pero es este buen diseño? Es la mezcla de callbacks y la excepción de tirar una buena idea? ¿Hay una mejor manera?
- Java libgdx mover la cámara de perspectiva
- ¿Cómo puedo suprimir nuevo anónimo runnable () se puede sustituir por lambda
- fije el ancho y la altura como porcentaje en el diseño relativo
- ¿Cómo tomar la captura de pantalla de la página de actividad ENTERO mediante programación?
- Cómo agregar Maven a un proyecto de IntelliJ Android existente
Con el siguiente enfoque podría obtener mensajes i18l desde dentro de mis excepciones personalizadas y brindar por el usuario.
public class RestClient implements IRestClient { private IRestAPI api; /** * * @param accessToken */ public RestClient(final String accessToken) { RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { request.addHeader("Authorization", "Bearer " + accessToken); } }; RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(Config.ENDPOINT) .setRequestInterceptor(requestInterceptor) .build(); api = restAdapter.create(IRestAPI.class); } @Override public void requestSomething(final Callback callback) { api.getSomething(new Callback<Something>() { @Override public void success(Something something, Response response) { callback.success(something, response); } @Override public void failure(RetrofitError error) { if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED)) { throw new AccessTokenExpired(); } else if(error.getMessage().getId().euqals(USER_NOT_FOUND)) { throw new UsernamePasswordNotFound(); } else // something else happened... { throw error; } } }); } @Override public void deleteSomething(final Callback callback) { api.deleteSomething(new Callback<Something>() { @Override public void success(Something something, Response response) { callback.success(something, response); } @Override public void failure(RetrofitError error) { if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND)) { ... ... Different exceptions } ... } }); } }
Naturalmente tendría que crear mi propia interfaz de devolución de llamada con sólo un método de éxito.
- ¿Cuál es la forma correcta de manejar el cambio de orientación cuando un diálogo de alerta personalizado tiene un hilador abierto?
- Rxjava Android cómo utilizar el operador Zip
- Cómo generar una consulta con la selección por valor del campo del objeto extraño
- Limitación de la velocidad de fotogramas con Thread.sleep ()
- No se puede crear una instancia del nombre de clase de tipo en cocos2d
- OnBackPressed () Mejor práctica / rendimiento
- Objeto global de la aplicación Android
- Validación de esquemas XML en Android
Al crear el RestAdapter
, puede proporcionar un controlador de errores que mapea sus excepciones personalizadas, omite la llamada al failure
en el Callback<T>
en cualquier cosa 4xx / 5xx. Como un ejemplo realmente artificial:
public class Scratch { public static void main(String[] args) { Endpoints e = new RestAdapter.Builder() .setEndpoint("http://google.com") .setLogLevel(RestAdapter.LogLevel.FULL) .setErrorHandler(new ErrorHandler() { @Override public Throwable handleError(RetrofitError cause) { switch (cause.getResponse().getStatus()) { case 400: /* Handle the expected body format */ cause.getBody(); throw new RuntimeException("Bad Request"); default: /* Things and stuff */ throw new RuntimeException(""); } } }) .build() .create(Endpoints.class); e.getGoogle(new Callback<Response>() { @Override public void success(Response response, Response response2) { System.out.println("Got it"); } @Override public void failure(RetrofitError error) { System.err.println("This won't ever be seen due to the error handler."); } }); } private static interface Endpoints { @GET("/foo/bar") void getGoogle(Callback<Response> callback); } }
Edit : Al hacer esto, sin embargo, potencialmente está sacrificando una gran razón por la que desea utilizar la interfaz de Callback
para empezar. Si se trata de un uso común que necesitará, puede tener más sentido utilizar las llamadas de sincronización y devolver el tipo de objeto. No entiendo su uso para decir que es necesario, pero parece que puede ser más apropiado.
- Android java.lang.NoClassDefFoundError utilizando las bibliotecas JODA
- No se pueden construir pruebas con Gradle (decard-gradle)