Chciałbym poradzić sobie z sytuacjami, gdy nie ma połączenia z Internetem. Zwykle biegałem:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
( stąd ) przed wysłaniem żądań do sieci i powiadom użytkownika, jeśli nie ma połączenia z Internetem.
Z tego co widziałem Retrofit nie radzi sobie specjalnie w tej sytuacji. Jeśli nie ma połączenia z Internetem, RetrofitError
jako powód podam limit czasu.
Jeśli chciałbym włączyć ten rodzaj sprawdzania do każdego żądania HTTP z funkcją Retrofit, jak mam to zrobić? A może w ogóle powinienem to zrobić.
Dzięki
Alex
Odpowiedzi:
Skończyło się na utworzeniu niestandardowego klienta Retrofit, który sprawdza łączność przed wykonaniem żądania i zgłasza wyjątek.
a następnie użyj go podczas konfigurowania
RestAdapter
źródło
NoConnectivityException
, możesz go rozszerzyćIOException
lub rozszerzyćRuntimeException
Od czasu modernizacji
1.8.0
jest to przestarzałemusisz użyć
istnieje wiele typów błędów, z którymi możesz sobie poradzić:
NETWORK
Wystąpił wyjątek IOException podczas komunikacji z serwerem, np. Przekroczenie limitu czasu, brak połączenia itp.CONVERSION
Zgłoszono wyjątek podczas (de) serializacji treści.HTTP
Z serwera odebrano kod stanu HTTP inny niż 200, np. 502, 503 itd.UNEXPECTED
Wystąpił błąd wewnętrzny podczas próby wykonania żądania. Najlepszym rozwiązaniem jest ponowne zgłoszenie tego wyjątku, aby aplikacja uległa awarii.źródło
equals
nad zmiennymi, zawsze używajCONSTANT.equals(variable)
zamiast tego, aby uniknąć możliwego NullPointerException. Lub jeszcze lepiej w tym przypadku, wyliczenia akceptują == porównanie, więcerror.getKind() == RetrofitError.Kind.NETWORK
może być lepszym podejściemW przypadku Retrofit 2 używamy implementacji OkHttp Interceptor do sprawdzania łączności sieciowej przed wysłaniem żądania. Jeśli nie ma sieci, odpowiednio wyślij wyjątek.
Pozwala to konkretnie poradzić sobie z problemami z łącznością sieciową przed przejściem do Retrofit.
źródło
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
powinno być TUTAJ?@AlexV Czy jesteś pewien, że błąd RetrofitError zawiera limit czasu jako przyczynę (wyjątek SocketTimeOutException, gdy wywoływana jest metoda getCause ()), gdy nie ma połączenia z Internetem?
O ile mi wiadomo, gdy nie ma połączenia z Internetem, RetrofitError zawiera jako przyczynę wyjątek ConnectionException.
Jeśli zaimplementujesz ErrorHandler , możesz zrobić coś takiego:
źródło
isNetworkError
pozbywanie się błędu hosta jest niemożliwe?error.getKind() == RetrofitError.Kind.NETWORK
Do modernizacji 1
Gdy otrzymujesz
Throwable
błąd z żądania http, możesz wykryć, czy jest to błąd sieci, za pomocą takiej metody:źródło
po prostu zrób to, otrzymasz powiadomienie nawet w przypadku problemów takich jak
,
i inni.
źródło
możesz użyć tego kodu
Response.java
NetworkError.java
Implementacja w Twoich metodach
źródło