Je voudrais gérer les situations où il n'y a pas de connexion Internet. Habituellement, je courrais:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
(à partir d' ici ) avant d'envoyer les demandes au réseau et avertir l'utilisateur s'il n'y a pas de connexion Internet.
D'après ce que j'ai vu, Retrofit ne gère pas spécifiquement cette situation. S'il n'y a pas de connexion Internet, j'obtiendrai juste un RetrofitError
délai d'attente comme raison.
Si je souhaite intégrer ce type de vérification dans chaque requête HTTP avec Retrofit, comment dois-je le faire? Ou devrais-je le faire du tout.
Merci
Alex
Réponses:
Ce que j'ai fini par faire, c'est créer un client Retrofit personnalisé qui vérifie la connectivité avant d'exécuter une demande et lève une exception.
puis utilisez-le lors de la configuration
RestAdapter
la source
NoConnectivityException
, vous pouvez soit l'étendre,IOException
soit l'étendreRuntimeException
Depuis la modernisation,
1.8.0
cela est obsolètetu dois utiliser
il existe plusieurs types d'erreurs que vous pouvez gérer:
NETWORK
Une IOException s'est produite lors de la communication avec le serveur, par exemple Timeout, No connection, etc ...CONVERSION
Une exception a été lancée lors de la (dé) sérialisation d'un corps.HTTP
Un code d'état HTTP autre que 200 a été reçu du serveur, par exemple 502, 503, etc ...UNEXPECTED
Une erreur interne s'est produite lors de la tentative d'exécution d'une demande. Il est recommandé de renvoyer cette exception afin que votre application se bloque.la source
equals
variables excessives, utilisez toujours à laCONSTANT.equals(variable)
place pour éviter d'éventuelles NullPointerException. Ou encore mieux dans ce cas, les énumérations acceptent la comparaison ==, ce quierror.getKind() == RetrofitError.Kind.NETWORK
pourrait être une meilleure approcheAvec Retrofit 2, nous utilisons une implémentation OkHttp Interceptor pour vérifier la connectivité réseau avant d'envoyer la demande. S'il n'y a pas de réseau, lancez une exception le cas échéant.
Cela permet de gérer spécifiquement les problèmes de connectivité réseau avant de passer à la modernisation.
la source
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
Que devrait être ici?@AlexV êtes-vous sûr que RetrofitError contient un timeout comme raison (SocketTimeOutException lorsque getCause () est appelé) lorsqu'il n'y a pas de connexion Internet?
Autant que je sache, quand il n'y a pas de connexion Internet, RetrofitError contient une ConnectionException comme cause.
Si vous implémentez un ErrorHandler, vous pouvez faire quelque chose comme ceci:
la source
isNetworkError
se débarrasse-t-il de l'incapacité de résoudre l'erreur de l'hôte?error.getKind() == RetrofitError.Kind.NETWORK
Pour la rénovation 1
Lorsque vous obtenez une
Throwable
erreur de votre requête http, vous pouvez détecter s'il s'agit d'une erreur réseau avec une méthode comme celle-ci:la source
faites simplement cela, vous serez averti même pour des problèmes tels que
,
et d'autres.
la source
vous pouvez utiliser ce code
Response.java
NetworkError.java
Implémentation dans vos méthodes
la source