Eu tenho um AsyncTask
que deve verificar o acesso à rede para um nome de host. Mas o doInBackground()
tempo limite nunca é excedido. Alguém tem uma pista?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
android
networking
asynchronous
Vidar Vestnes
fonte
fonte
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Veja minha resposta para uma implementação melhor disso. Entre a resposta aceita (e muitas outras aqui), basta verificar se há uma conexão de rede , não a Internet.Respostas:
Conexão de rede / acesso à Internet
isConnectedOrConnecting()
(usado na maioria das respostas) verifica qualquer conexão de redeA) Faça ping em um servidor (fácil)
+
poderia rodar na thread principal-
não funciona em alguns dispositivos antigos (Galays S3, etc.), bloqueia um pouco se não houver internet disponível.B) Conecte-se a um soquete na Internet (avançado)
+
muito rápido (de qualquer maneira), funciona em todos os dispositivos, muito confiável-
não pode ser executado no thread da interface do usuárioIsso funciona de maneira muito confiável em todos os dispositivos e é muito rápido. Ele precisa ser executado em uma tarefa separada (por exemplo,
ScheduledExecutorService
ouAsyncTask
).Possíveis perguntas
É realmente rápido o suficiente?
Sim, muito rápido ;-)
Não existe uma maneira confiável de verificar a Internet, além de testar algo na Internet?
Não tanto quanto eu sei, mas me avise, e editarei minha resposta.
E se o DNS estiver inoperante?
O DNS do Google (por exemplo
8.8.8.8
) é o maior DNS público do mundo. A partir de 2013, atendia 130 bilhões de solicitações por dia. Digamos que seu aplicativo provavelmente não seria o assunto do dia.Quais permissões são necessárias?
Apenas acesso à Internet - surpresa ^^ (Como você já pensou, como alguns dos métodos sugeridos aqui podem até ter uma cola remota sobre o acesso à Internet, sem essa permissão?)
Extra:
AsyncTask
Exemplo de um tiroExtra:
RxJava/RxAndroid
Exemplo de um tiro (Kotlin)fonte
Se o dispositivo estiver no modo avião (ou presumivelmente em outras situações em que não há rede disponível),
cm.getActiveNetworkInfo()
estaránull
, então você precisará adicionar umanull
verificação.Modificado ( solução de Eddie ) abaixo:
Adicione também a seguinte permissão ao
AndroidManifest.xml
:Um outro pequeno ponto, se você precisar absolutamente de uma conexão de rede no momento especificado, talvez seja melhor usá-lo
netInfo.isConnected()
do quenetInfo.isConnectedOrConnecting
. Acho que isso depende do caso de uso individual.fonte
context.getSystemService
ou ele não funciona. Eu tenho a minha pista aqui androidhive.info/2012/07/...Não precisa ser complexo. A maneira mais simples e de estrutura é usar
ACCESS_NETWORK_STATE
permissão e apenas criar um método conectadoVocê também pode usar
requestRouteToHost
se tiver em mente um host e um tipo de conexão específicos (wifi / celular).Você também precisará de:
no seu manifesto android.
fonte
context.getSystemService
ou ele não funciona. Eu tenho a minha pista aqui androidhive.info/2012/07/...getAllNetworkInfo()
foi descontinuado no nível 29 da APIPara começar
getActiveNetworkInfo()
a trabalhar, você precisa adicionar o seguinte ao manifesto.fonte
getActiveNetworkInfo()
é obsoleto em nível API 29.Dê uma olhada na classe ConnectivityManager. Você pode usar essa classe para obter informações sobre as conexões ativas em um host. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDIT: você pode usar
ou
e analise a enumeração Detalhada do objeto NetworkInfo retornado
EDIT EDIT: Para descobrir se você pode acessar um host, use
Obviamente, estou usando Context.getSystemService (Context.CONNECTIVITY_SERVICE) como um proxy para dizer
fonte
verifique este código ... funcionou para mim :)
Em seguida, defino o manipulador:
... e inicie o teste:
fonte
Encontrado e modificado (!) Neste link :
No seu arquivo de manifesto, adicione pelo menos:
Você provavelmente já tem a permissão INTERNET se estiver acessando. Em seguida, uma função booleana que permite testar a conectividade é:
fonte
Eu criei esse código, é o mais simples e é apenas um booleano. perguntando
if(isOnline()){
Você obtém se há uma conexão e se pode conectar a uma página o código de status
200
(conexão estável).Certifique-se de adicionar o correto
INTERNET
e asACCESS_NETWORK_STATE
permissões.fonte
Funciona para mim:
Para verificar a disponibilidade da rede:
Para verificar o acesso à Internet:
fonte
Há mais de uma maneira
Primeiro, o caminho mais curto, mas ineficiente
Permissão de estado de rede necessária apenas
Então este método,
Como visto nas respostas,
ConnectivityManager
é uma solução, eu apenas o adicionei dentro de um método. Este é um método simplificado. Todo usoConnectivityManager
retorna true se houver acesso à rede e não à Internet, significa que se o seu WiFi estiver conectado a um roteador, mas o roteador não tiver Internet retorna true, verifica a disponibilidade da conexãoSegundo, maneira eficiente
Estado da rede e permissões da Internet necessárias
Então esta aula,
Ligar
CheckInternetAsyncTask
Algumas explicações: -
você tem que verificar a Internet
AsyncTask
, caso contrário, pode jogarandroid.os.NetworkOnMainThreadException
em alguns casosConnectivityManager
usado para verificar o acesso à rede se true envia solicitação (Ping)Solicitar envio para
http://clients3.google.com/generate_204
, Este conhecido URL é conhecido por retornar uma página vazia com um status HTTP 204, que é mais rápido e mais eficiente do quehttp://www.google.com
, leia isto . se você tiver um site, é preferível colocá-lo no lugar do google, somente se você o usar no aplicativoO intervalo pode ser alterado (20ms -> 2000ms), 1500ms é comumente usado
fonte
De tudo que vi até agora, o caminho mais curto e limpo deve ser:
PS: Isso não executa ping em nenhum host, apenas verifica o status da conexão; portanto, se o seu roteador não tiver conexão com a Internet e o dispositivo estiver conectado a ele, esse método retornará verdadeiro, embora você não tenha Internet.
Para um teste real, eu recomendaria a execução de uma solicitação HttpHead (por exemplo, www.google.com) e verificaria o status, se o seu 200 OK estiver tudo bem e o seu dispositivo tiver uma conexão com a Internet.
fonte
Aqui está o método que eu uso:
Melhor ainda, verifique se está "conectado":
Aqui está como usar o método:
Permissão necessária:
https://stackoverflow.com/a/16124915/950427
fonte
Um caso de uso importante em dispositivos móveis para garantir a existência de uma conexão real. Esse é um problema comum quando um usuário móvel entra em uma rede Wi-Fi com um "Portal Cativo", no qual ele precisa entrar. Eu uso essa função de bloqueio em segundo plano para garantir a existência de uma conexão.
fonte
Você pode percorrer todas as conexões de rede e verificar se há pelo menos uma conexão disponível:
fonte
Para mim, não era uma boa prática verificar o estado da conexão na classe Activity, porque
deve ser chamado lá, ou você precisa enviar a instância de Activity (contexto) para a classe do manipulador de conexões para verificar o estado da conexão lá. Quando não há conexão disponível (wifi, rede), pego a exceção UnknownHostException :
Dessa forma, eu posso lidar com esse caso junto com os outros casos da mesma classe (meu servidor sempre responde com uma string json)
fonte
Isso funciona para mim. Experimente.
fonte
Este método oferece a opção de um método realmente rápido (para feedback em tempo real) ou um método mais lento (para verificações pontuais que exigem confiabilidade)
fonte
Estou usando esse código em vez do InetAddress:
fonte
Não é complexo verificar o status de conectividade da rede / internet Android. A
DetectConnection
classe abaixo ajudará você a verificar este status:Para obter mais detalhes, visite Como verificar o status da conectividade com a rede / Internet Android
fonte
Melhor abordagem:
fonte
A seguir está o código da minha
Utils
classe:fonte
fonte
Você pode usar esse método para detectar a disponibilidade da rede.
fonte
Apliquei a solução fornecida pelo @Levit e criei a função que não chamará a Solicitação Http extra.
Resolverá o erro
Unable to Resolve Host
Agora chame assim,
fonte
Isso é abordado nos documentos do Android http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
fonte
Eu passei por todas as respostas e venho com a minha própria resposta, que primeiro verifica se a Internet está disponível e se a Internet está disponível e depois verifica se está ativa ou não.
Incluí todos os métodos e classes necessários para verificar a conexão ativa com a Internet.
NetworkUtils.class
Você pode verificar se a Internet está ativa usando o código abaixo:
fonte
Muito importante para verificar se temos conectividade com isAvailable () e se é possível estabelecer uma conexão com isConnected ()
e você pode determinar o tipo de WiFi ativo da rede :
ou móvel Móvil :
não esqueça as permissões:
fonte
Kotlin e corotinas
Eu coloquei a função em a
ViewModel
, que possui oviewModelScope
. Usando um observávelLiveData
, informo uma atividade sobre a conexão.ViewModel
Atividade
fonte
Basta criar a seguinte classe que verifica a conexão à Internet:
Essa classe simplesmente contém um método que retorna o valor booleano do status da conexão. Portanto, em termos simples, se o método encontrar uma conexão válida com a Internet, o valor retornado será
true
, caso contrário,false
se nenhuma conexão válida for encontrada.O método a seguir em MainActivity chama o resultado do método descrito anteriormente e solicita que o usuário aja de acordo:
No código acima, se o resultado for falso, (portanto, não há conexão com a Internet, o usuário é levado ao painel wi-fi do Android, onde é solicitado a se conectar a um ponto de acesso wi-fi.
fonte
Atualização 29/06/2015 Se você estiver usando o Xamarin.Android e quiser verificar a conectividade, poderá usar um pacote Nuget que forneceria essa funcionalidade em várias plataformas. Bons candidatos estão aqui e aqui . [Fim da atualização]
As respostas acima são muito boas, mas estão todas em Java e quase todas verificam a conectividade. No meu caso, eu precisava ter conectividade com um tipo específico de conexão e estou desenvolvendo no Xamarin.Android. Além disso, não passo uma referência às minhas atividades Contexto na camada Hardware, uso o Contexto do Aplicativo. Então, aqui está a minha solução, caso alguém venha aqui com requisitos semelhantes. No entanto, ainda não fiz o teste completo, atualizará a resposta assim que terminar o teste
fonte