Ich möchte Situationen behandeln, in denen keine Internetverbindung besteht. Normalerweise würde ich laufen:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
(von hier aus ) bevor Sie die Anforderungen an das Netzwerk senden und den Benutzer benachrichtigen, wenn keine Internetverbindung besteht.
Nach allem, was ich gesehen habe, geht Retrofit nicht speziell mit dieser Situation um. Wenn es keine Internetverbindung gibt, bekomme ich nur eine RetrofitError
Zeitüberschreitung als Grund.
Wie soll ich vorgehen, wenn ich diese Art der Prüfung in jede HTTP-Anfrage mit Retrofit integrieren möchte? Oder sollte ich es überhaupt tun?
Vielen Dank
Alex
Antworten:
Am Ende habe ich einen benutzerdefinierten Retrofit-Client erstellt, der vor dem Ausführen einer Anforderung auf Konnektivität überprüft und eine Ausnahme auslöst.
und verwenden Sie es dann bei der Konfiguration
RestAdapter
quelle
NoConnectivityException
, können Sie es entweder erweiternIOException
oder erweitern lassenRuntimeException
Seit der Nachrüstung
1.8.0
ist dies veraltetdu musst benutzen
Es gibt mehrere Arten von Fehlern, die Sie behandeln können:
NETWORK
Während der Kommunikation mit dem Server ist eine IOException aufgetreten, z. B. Timeout, Keine Verbindung usw.CONVERSION
Beim (De-) Serialisieren eines Körpers wurde eine Ausnahme ausgelöst.HTTP
Ein Nicht-200-HTTP-Statuscode wurde vom Server empfangen, z. B. 502, 503 usw.UNEXPECTED
Beim Versuch, eine Anforderung auszuführen, ist ein interner Fehler aufgetreten. Es wird empfohlen, diese Ausnahme erneut auszulösen, damit Ihre Anwendung abstürzt.quelle
equals
Verwenden SieCONSTANT.equals(variable)
stattdessen immer stattdessen, um mögliche NullPointerException zu vermeiden. Oder noch besser in diesem Fall, Aufzählungen akzeptieren == Vergleich, alsoerror.getKind() == RetrofitError.Kind.NETWORK
könnte ein besserer Ansatz seinBei Retrofit 2 verwenden wir eine OkHttp Interceptor-Implementierung, um vor dem Senden der Anforderung die Netzwerkkonnektivität zu überprüfen. Wenn kein Netzwerk vorhanden ist, lösen Sie eine entsprechende Ausnahme aus.
Auf diese Weise können Probleme mit der Netzwerkkonnektivität speziell behandelt werden, bevor Retrofit aktiviert wird.
quelle
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
Was sollte HIER sein?@AlexV Sind Sie sicher, dass der RetrofitError eine Zeitüberschreitung als Grund enthält (SocketTimeOutException, wenn getCause () aufgerufen wird), wenn keine Internetverbindung besteht?
Soweit ich weiß, enthält der RetrofitError eine ConnectionException als Ursache, wenn keine Internetverbindung besteht.
Wenn Sie einen ErrorHandler implementieren, können Sie Folgendes tun:
quelle
isNetworkError
der Host-Fehler nicht behoben werden ?error.getKind() == RetrofitError.Kind.NETWORK
Zur Nachrüstung 1
Wenn Sie
Throwable
von Ihrer http-Anfrage einen Fehler erhalten, können Sie mit einer Methode wie der folgenden feststellen, ob es sich um einen Netzwerkfehler handelt:quelle
Tun Sie dies einfach, Sie werden auch bei Problemen wie benachrichtigt
,
und andere.
quelle
Sie können diesen Code verwenden
Response.java
NetworkError.java
Implementierung in Ihre Methoden
quelle