Eu gostaria de lidar com situações em que não há conexão com a internet. Normalmente eu corria:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
( daqui ) antes de enviar as solicitações para a rede e notificar o usuário se não houver conexão com a Internet.
Pelo que vi, o Retrofit não lida especificamente com essa situação. Se não houver conexão com a Internet, RetrofitError
acabarei com o tempo limite como motivo.
Se eu gostaria de incorporar esse tipo de verificação em cada solicitação HTTP com o Retrofit, como devo fazê-lo? Ou devo fazê-lo?
obrigado
Alex
Respostas:
O que acabei fazendo foi criar um cliente Retrofit personalizado que verifica a conectividade antes de executar uma solicitação e gera uma exceção.
e depois use-o ao configurar
RestAdapter
fonte
NoConnectivityException
, você pode torná-lo estenderIOException
ou torná-lo estenderRuntimeException
Desde a atualização,
1.8.0
isso foi preteridovocê tem que usar
existem vários tipos de erros que você pode manipular:
NETWORK
Ocorreu uma IOException ao se comunicar com o servidor, por exemplo, Tempo limite, Sem conexão, etc ...CONVERSION
Uma exceção foi lançada ao (des) serializar um corpo.HTTP
Um código de status HTTP não-200 foi recebido do servidor, por exemplo, 502, 503, etc.UNEXPECTED
Ocorreu um erro interno ao tentar executar uma solicitação. É uma boa prática relançar essa exceção para que seu aplicativo falhe.fonte
equals
variáveis em excesso, sempre useCONSTANT.equals(variable)
para evitar a possível NullPointerException. Ou ainda melhor, neste caso, enums aceitar == comparação assimerror.getKind() == RetrofitError.Kind.NETWORK
pode ser uma abordagem melhorCom o Retrofit 2, usamos uma implementação do OkHttp Interceptor para verificar a conectividade da rede antes de enviar a solicitação. Se não houver rede, lance uma exceção conforme apropriado.
Isso permite que você lide especificamente com problemas de conectividade de rede antes de acessar o Retrofit.
fonte
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
que deve estar aqui?@AlexV, você tem certeza de que o RetrofitError contém um tempo limite como motivo (SocketTimeOutException quando getCause () é chamado) quando não há conexão com a Internet?
Até onde eu sei, quando não há conexão com a Internet, o RetrofitError contém uma ConnectionException como causa.
Se você implementar um ErrorHandler, poderá fazer algo assim:
fonte
isNetworkError
se livrar de incapaz de resolver o erro do host?error.getKind() == RetrofitError.Kind.NETWORK
Para Retrofit 1
Quando você recebe um
Throwable
erro da sua solicitação http, pode detectar se é um erro de rede com um método como este:fonte
basta fazer isso, você será notificado mesmo sobre questões como
,
e outros.
fonte
você pode usar esse código
Response.java
NetworkError.java
Implementação em seus métodos
fonte