Tengo un AsyncTask
dispositivo que se supone que verifica el acceso de red a un nombre de host. Pero doInBackground()
nunca se agota el tiempo de espera. Alguien tiene una 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
fuente
fuente
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Vea mi respuesta para una mejor implementación de esto. Por cierto, la respuesta aceptada (y muchas otras aquí) simplemente verifique si hay una conexión de red , no internet.Respuestas:
Conexión de red / acceso a Internet
isConnectedOrConnecting()
(utilizado en la mayoría de las respuestas) verifica cualquier conexión de redA) Hacer ping a un servidor (fácil)
+
podría ejecutarse en el hilo principal-
no funciona en algunos dispositivos antiguos (Galays S3, etc.), bloquea un tiempo si no hay Internet disponible.B) Conéctese a un enchufe en Internet (avanzado)
+
muy rápido (de cualquier manera), funciona en todos los dispositivos, muy confiable-
no se puede ejecutar en el hilo de la interfaz de usuarioEsto funciona de manera muy confiable, en todos los dispositivos, y es muy rápido. Sin embargo, debe ejecutarse en una tarea separada (por ejemplo,
ScheduledExecutorService
oAsyncTask
).Posibles preguntas
¿Es realmente lo suficientemente rápido?
Sí, muy rápido ;-)
¿No hay una forma confiable de verificar Internet, aparte de probar algo en Internet?
No hasta donde yo sé, pero hágamelo saber y editaré mi respuesta.
¿Qué pasa si el DNS está caído?
Google DNS (por ejemplo
8.8.8.8
) es el DNS público más grande del mundo. A partir de 2013 atendió 130 mil millones de solicitudes por día. Digamos que su aplicación probablemente no sea la conversación del día.¿Qué permisos se requieren?
Solo acceso a Internet: sorpresa ^^ (Por cierto, ¿alguna vez has pensado en cómo algunos de los métodos sugeridos aquí podrían tener un pegamento remoto sobre el acceso a Internet, sin este permiso?)
Extra:
AsyncTask
ejemplo de un disparoExtra:
RxJava/RxAndroid
Ejemplo de un disparo (Kotlin)fuente
Si el dispositivo está en modo avión (o presumiblemente en otras situaciones en las que no hay una red disponible),
cm.getActiveNetworkInfo()
lo estaránull
, por lo que debe agregar unnull
cheque.Modificado ( solución de Eddie ) a continuación:
Agregue también el siguiente permiso a
AndroidManifest.xml
:Otro pequeño punto, si absolutamente necesita una conexión de red en el punto dado en el tiempo, entonces podría ser mejor usar en
netInfo.isConnected()
lugar denetInfo.isConnectedOrConnecting
. Sin embargo, supongo que esto depende del caso de uso individual.fuente
context.getSystemService
o no funciona. Tengo mi pista aquí androidhive.info/2012/07/…No es necesario ser complejo. La manera más simple y marco es usar el
ACCESS_NETWORK_STATE
permiso y simplemente hacer un método conectadoTambién puede usarlo
requestRouteToHost
si tiene en mente un host particular y un tipo de conexión (wifi / móvil).También necesitarás:
en tu manifiesto de Android.
fuente
context.getSystemService
o no funciona. Tengo mi pista aquí androidhive.info/2012/07/…getAllNetworkInfo()
está en desuso en el nivel API 29Para comenzar
getActiveNetworkInfo()
a trabajar necesita agregar lo siguiente al manifiesto.fuente
getActiveNetworkInfo()
está en desuso en el nivel API 29.Eche un vistazo a la clase ConnectivityManager. Puede usar esta clase para obtener información sobre las conexiones activas en un host. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDITAR: Puedes usar
o
y analice la enumeración detallada de estado del objeto NetworkInfo devuelto
EDITAR EDITAR: para averiguar si puede acceder a un host, puede usar
Obviamente, estoy usando Context.getSystemService (Context.CONNECTIVITY_SERVICE) como proxy para decir
fuente
mira este código ... funcionó para mí :)
Luego, defino el controlador:
... y lanza la prueba:
fuente
Encontrado en y modificado (!) Desde este enlace :
En su archivo de manifiesto agregue al menos:
Probablemente ya tenga el permiso de INTERNET si está accediendo a él. Entonces, una función booleana que permite probar la conectividad es:
fuente
Hice este código, es el más simple y es solo un booleano. preguntando
if(isOnline()){
Obtiene si hay una conexión y si puede conectarse a una página el código de estado
200
(conexión estable).Asegúrese de agregar el correcto
INTERNET
y losACCESS_NETWORK_STATE
permisos.fuente
A mí me funciona:
Para verificar la disponibilidad de la red:
Para verificar el acceso a internet:
fuente
Hay más de una manera
Primero, el camino más corto pero ineficiente
Solo se necesita permiso de estado de red
Entonces este método,
Como se ve en las respuestas,
ConnectivityManager
es una solución, solo la agregué dentro de un método, este es un método simplificado, todo usoConnectivityManager
devuelve verdadero si hay un acceso a la red, no acceso a Internet, significa que su WiFi está conectado a un enrutador pero el enrutador no tiene Internet devuelve verdadero, verifica la disponibilidad de conexiónSegundo, de manera eficiente
Estado de red y permisos de Internet necesarios
Entonces esta clase,
Llamada
CheckInternetAsyncTask
Algunas explicaciones: -
tienes que revisar Internet
AsyncTask
, de lo contrario puede arrojarandroid.os.NetworkOnMainThreadException
en algunos casosConnectivityManager
se utiliza para verificar el acceso a la red si la solicitud de envío verdadero (Ping)Solicitud de envío a
http://clients3.google.com/generate_204
, Se sabe que esta conocida URL devuelve una página vacía con un estado HTTP 204, esto es más rápido y más eficiente quehttp://www.google.com
, lea esto . si tiene un sitio web, es preferible poner su sitio web en lugar de google, solo si lo usa dentro de la aplicaciónSe puede cambiar el intervalo de tiempo de espera (20 ms -> 2000 ms), se suele utilizar 1500 ms
fuente
De todo lo que he visto hasta ahora, la forma más corta y limpia debería ser:
PD: Esto no hace ping a ningún host, solo verifica el estado de la conexión, por lo que si su enrutador no tiene conexión a Internet y su dispositivo está conectado a él, este método volverá verdadero aunque no tenga Internet.
Para una prueba real, recomendaría ejecutar una solicitud HttpHead (por ejemplo, en www.google.com) y verificar el estado, si es 200 OK, todo está bien y su dispositivo tiene una conexión a Internet.
fuente
Aquí está el método que uso:
Aún mejor, verifique que esté "conectado":
Aquí está cómo usar el método:
Permiso necesario:
https://stackoverflow.com/a/16124915/950427
fuente
Un caso de uso importante en dispositivos móviles para garantizar que exista una conexión real. Este es un problema común cuando un usuario móvil ingresa a una red Wifi con un "Portal cautivo", en el que necesita iniciar sesión. Utilizo esta función de bloqueo en segundo plano para asegurar que exista una conexión.
fuente
Puede iterar sobre todas las conexiones de red y verificar si hay al menos una conexión disponible:
fuente
Para mí no era una buena práctica verificar el estado de la conexión en la clase Actividad, porque
debe llamarse allí, o debe empujar hacia abajo su instancia de Actividad (contexto) a la clase de controlador de conexión para poder verificar el estado de la conexión allí Cuando no hay conexión disponible (wifi, red), cojo la excepción UnknownHostException :
De esta forma puedo manejar este caso junto con los otros casos en la misma clase (mi servidor siempre responde con una cadena json)
fuente
A mí me funciona. Pruébalo.
fuente
Este método le brinda la opción de un método realmente rápido (para comentarios en tiempo real) o un método más lento (para verificaciones únicas que requieren confiabilidad)
fuente
Estoy usando este código en lugar de InetAddress:
fuente
No es complejo verificar el estado de la red Android / conectividad a Internet. La siguiente
DetectConnection
clase lo ayudará a verificar este estado:Para obtener más detalles, visite Cómo verificar el estado de conectividad de red / Internet de Android
fuente
Mejor enfoque:
fuente
El siguiente es el código de mi
Utils
clase:fuente
fuente
Puede usar este método para detectar la disponibilidad de la red.
fuente
He aplicado la solución proporcionada por @Levit y he creado una función que no llamará a la solicitud Http adicional.
Resolverá el error
Unable to Resolve Host
Ahora llámalo como,
fuente
Esto está cubierto en los documentos de Android http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
fuente
Revisé todas las respuestas y llegué a mi propia respuesta, que primero verifica si Internet está disponible y si Internet está disponible, luego verifica si está activo o no.
He incluido todos los métodos y clases necesarios para verificar la conexión activa a Internet.
NetworkUtils.class
Puede verificar si Internet está activo usando el siguiente código:
fuente
Es muy importante verificar si tenemos conectividad con isAvailable () y si es posible establecer una conexión con isConnected ()
y puede determinar el tipo de red WiFi activa :
o móvil Móvil :
no olvides los permisos:
fuente
Kotlin y corutinas
He colocado la función en a
ViewModel
, que tiene elviewModelScope
. Usando un observableLiveData
informo a una actividad sobre la conexión.ViewModel
Actividad
fuente
Simplemente cree la siguiente clase que verifica la conexión a Internet:
Esta clase simplemente contiene un método que devuelve el valor booleano del estado de la conexión. Por lo tanto, en términos simples, si el método encuentra una conexión válida a Internet, el valor de retorno es
true
, de lo contrariofalse
si no se encuentra una conexión válida.El siguiente método en MainActivity llama al resultado del método descrito anteriormente, y solicita al usuario que actúe en consecuencia:
En el código anterior, si el resultado es falso (por lo tanto, no hay conexión a Internet, el usuario es llevado al panel de wi-fi de Android, donde se le solicita que se conecte a un punto de acceso inalámbrico).
fuente
Actualización 29/06/2015 Si está utilizando Xamarin.Android y desea verificar la conectividad, puede usar un paquete Nuget que le brinde esta funcionalidad en múltiples plataformas. Los buenos candidatos están aquí y aquí. . [Fin de la actualización]
Las respuestas anteriores son bastante buenas, pero están todas en Java, y casi todas verifican la conectividad. En mi caso, necesitaba tener conectividad con un tipo específico de conexión y estoy desarrollando en Xamarin.Android. Además, no paso una referencia al Contexto de mis actividades en la capa Hardware, uso el Contexto de la aplicación. Así que aquí está mi solución, en caso de que alguien venga con requisitos similares. Sin embargo, no he realizado pruebas completas, actualizaré la respuesta una vez que haya terminado con mis pruebas
fuente