Me gustaría manejar situaciones en las que no hay conexión a Internet. Normalmente corro:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
(desde aquí ) antes de enviar las solicitudes a la red y notificar al usuario si no hubo conexión a Internet.
Por lo que vi, Retrofit no maneja esta situación específicamente. Si no hay conexión a Internet, simplemente obtendré el RetrofitError
tiempo de espera como motivo.
Si quisiera incorporar este tipo de verificación en cada solicitud HTTP con Retrofit, ¿cómo debo hacerlo? O debería hacerlo en absoluto.
Gracias
Alex
Respuestas:
Lo que terminé haciendo es crear un cliente Retrofit personalizado que verifica la conectividad antes de ejecutar una solicitud y lanza una excepción.
y luego utilícelo al configurar
RestAdapter
fuente
NoConnectivityException
, puede extenderloIOException
o extenderloRuntimeException
Desde la actualización,
1.8.0
esto ha quedado obsoletotienes que usar
hay varios tipos de errores que puede manejar:
NETWORK
Se produjo una IOException durante la comunicación con el servidor, por ejemplo, tiempo de espera, sin conexión, etc.CONVERSION
Se lanzó una excepción al (des) serializar un cuerpo.HTTP
Se recibió un código de estado HTTP distinto de 200 del servidor, por ejemplo, 502, 503, etc.UNEXPECTED
Se produjo un error interno al intentar ejecutar una solicitud. Es una buena práctica volver a lanzar esta excepción para que su aplicación se bloquee.fuente
equals
sobre variables, use siempre en suCONSTANT.equals(variable)
lugar para evitar posibles NullPointerException. O incluso mejor en este caso, las enumeraciones aceptan == comparación, por lo queerror.getKind() == RetrofitError.Kind.NETWORK
podría ser un mejor enfoqueCon Retrofit 2, usamos una implementación de OkHttp Interceptor para verificar la conectividad de la red antes de enviar la solicitud. Si no hay red, lance una excepción según corresponda.
Esto le permite a uno manejar específicamente los problemas de conectividad de la red antes de optar por Retrofit.
fuente
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
¿Qué debería estar AQUÍ?@AlexV, ¿está seguro de que RetrofitError contiene un tiempo de espera como motivo (SocketTimeOutException cuando se llama a getCause ()) cuando no hay conexión a Internet?
Hasta donde yo sé, cuando no hay conexión a Internet, el RetrofitError contiene una ConnectionException como causa.
Si implementa un ErrorHandler , puede hacer algo como esto:
fuente
isNetworkError
deshacerse de no puede resolver el error del host?error.getKind() == RetrofitError.Kind.NETWORK
Para reequipamiento 1
Cuando recibe un
Throwable
error de su solicitud http, puede detectar si se trata de un error de red con un método como este:fuente
solo haga esto, se le notificará incluso para problemas como
,
y otros.
fuente
puedes usar este código
Response.java
NetworkError.java
Implementación en tus métodos
fuente