Я бы хотел справиться с ситуациями, когда нет подключения к Интернету. Обычно я бегал:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
( отсюда ) перед отправкой запросов в сеть и уведомить пользователя, если нет подключения к Интернету.
Из того, что я видел, Retrofit специально не справляется с этой ситуацией. Если нет подключения к Интернету, я просто получу RetrofitError
тайм-аут в качестве причины.
Если я хочу включить такую проверку в каждый HTTP-запрос с помощью Retrofit, как мне это сделать? Или мне вообще стоит это делать.
Спасибо
Alex
Ответы:
В итоге я создал настраиваемый клиент Retrofit, который проверяет подключение перед выполнением запроса и выдает исключение.
а затем использовать его при настройке
RestAdapter
источник
NoConnectivityException
, вы можете либо расширить,IOException
либо расширить егоRuntimeException
После модернизации
1.8.0
это устарелоты должен использовать
есть несколько типов ошибок, с которыми вы можете справиться:
NETWORK
Во время связи с сервером возникла исключительная ситуация IOException, например тайм-аут, нет соединения и т. Д.CONVERSION
Возникло исключение при (де) сериализации тела.HTTP
От сервера был получен код состояния HTTP, отличный от 200, например 502, 503 и т. Д.UNEXPECTED
Произошла внутренняя ошибка при попытке выполнить запрос. Лучше всего повторно вызвать это исключение, чтобы ваше приложение аварийно завершило работу.источник
equals
переменных, всегда используйтеCONSTANT.equals(variable)
вместо них, чтобы избежать возможного исключения NullPointerException. Или даже лучше в этом случае, enums accept ==error.getKind() == RetrofitError.Kind.NETWORK
В Retrofit 2 мы используем реализацию OkHttp Interceptor для проверки подключения к сети перед отправкой запроса. Если нет сети, сгенерируйте соответствующее исключение.
Это позволяет решать проблемы с сетевым подключением до того, как приступить к модернизации.
источник
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
Что должно быть ЗДЕСЬ?@AlexV, вы уверены, что RetrofitError содержит тайм-аут как причину (SocketTimeOutException при вызове getCause ()) при отсутствии подключения к Интернету?
Насколько я знаю, когда нет подключения к Интернету, RetrofitError содержит исключение ConnectionException в качестве причины.
Если вы реализуете ErrorHandler, вы можете сделать что-то вроде этого:
источник
isNetworkError
избавиться от ошибки хоста невозможно?error.getKind() == RetrofitError.Kind.NETWORK
Для модернизации 1
Когда вы получаете сообщение
Throwable
об ошибке в HTTP-запросе, вы можете определить, является ли это сетевой ошибкой, с помощью следующего метода:источник
просто сделайте это, вы будете уведомлены даже о таких проблемах, как
,
и другие.
источник
вы можете использовать этот код
Response.java
NetworkError.java
Реализация в ваших методах
источник