J'ai obtenu un AsyncTask
qui est censé vérifier l'accès réseau à un nom d'hôte. Mais le doInBackground()
n'est jamais expiré. Quelqu'un a une idée?
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
la source
la source
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Voir ma réponse pour une meilleure mise en œuvre de cela. Btw la réponse acceptée (et bien d'autres ici) vérifie simplement une connexion réseau , pas Internet.Réponses:
Connexion réseau / accès Internet
isConnectedOrConnecting()
(utilisé dans la plupart des réponses) vérifie toute connexion réseauA) Ping un serveur (facile)
+
pourrait fonctionner sur le thread principal-
ne fonctionne pas sur certains appareils anciens (Galays S3, etc.), il bloque un certain temps si aucune connexion Internet n'est disponible.B) Se connecter à un socket sur Internet (avancé)
+
très rapide (de toute façon), fonctionne sur tous les appareils, très fiable-
ne peut pas fonctionner sur le thread d'interface utilisateurCela fonctionne de manière très fiable, sur tous les appareils, et est très rapide. Il doit cependant être exécuté dans une tâche distincte (par exemple
ScheduledExecutorService
ouAsyncTask
).Questions possibles
Est-ce vraiment assez rapide?
Oui, très vite ;-)
Existe-t-il un moyen fiable de vérifier Internet, autre que de tester quelque chose sur Internet?
Pas autant que je sache, mais faites-le moi savoir et je modifierai ma réponse.
Et si le DNS est en panne?
Le DNS de Google (par exemple
8.8.8.8
) est le plus grand DNS public au monde. En 2013, il traitait 130 milliards de demandes par jour. Disons simplement que votre application ne sera probablement pas le sujet du jour.Quelles autorisations sont nécessaires?
Juste un accès Internet - surprise ^^ (Au fait, avez-vous déjà pensé à la façon dont certaines des méthodes suggérées ici pourraient même avoir une colle à distance sur l'accès à Internet, sans cette autorisation?)
Extra:
AsyncTask
Exemple ponctuelExtra:
RxJava/RxAndroid
Exemple ponctuel (Kotlin)la source
Si l'appareil est en mode avion (ou probablement dans d'autres situations où il n'y a pas de réseau disponible), ce
cm.getActiveNetworkInfo()
sera le casnull
, vous devez donc ajouter unenull
vérification.Modifié ( solution d'Eddie ) ci-dessous:
Ajoutez également l'autorisation suivante au
AndroidManifest.xml
:Un autre petit point, si vous avez absolument besoin d'une connexion réseau à un moment donné, alors il pourrait être préférable d'utiliser
netInfo.isConnected()
plutôt quenetInfo.isConnectedOrConnecting
. Je suppose que cela dépend du cas d'utilisation individuel.la source
context.getSystemService
ça ne marche pas. J'ai eu mon indice ici androidhive.info/2012/07/…Pas besoin d'être complexe. La manière la plus simple et la plus structurée consiste à utiliser l'
ACCESS_NETWORK_STATE
autorisation et à créer une méthode connectéeVous pouvez également l'utiliser
requestRouteToHost
si vous avez un hôte particulier et un type de connexion (wifi / mobile) à l'esprit.Vous aurez également besoin de:
dans votre manifeste Android.
la source
context.getSystemService
ça ne marche pas. J'ai eu mon indice ici androidhive.info/2012/07/…getAllNetworkInfo()
est obsolète dans le niveau 29 de l'APIPour vous mettre
getActiveNetworkInfo()
au travail, vous devez ajouter ce qui suit au manifeste.la source
getActiveNetworkInfo()
est déconseillé dans le niveau 29 de l'API.Jetez un œil à la classe ConnectivityManager. Vous pouvez utiliser cette classe pour obtenir des informations sur les connexions actives sur un hôte. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDIT: vous pouvez utiliser
ou
et analyser l'énumération DetailState de l'objet NetworkInfo retourné
EDIT EDIT: Pour savoir si vous pouvez accéder à un hôte, vous pouvez utiliser
Évidemment, j'utilise Context.getSystemService (Context.CONNECTIVITY_SERVICE) comme proxy pour dire
la source
vérifiez ce code ... cela a fonctionné pour moi :)
Ensuite, je définis le gestionnaire:
... et lancez le test:
la source
Trouvé et modifié (!) À partir de ce lien :
Dans votre fichier manifeste, ajoutez au moins:
Vous avez probablement déjà l'autorisation INTERNET si vous y accédez. Ensuite, une fonction booléenne qui permet de tester la connectivité est:
la source
J'ai fait ce code, c'est le plus simple et c'est juste un booléen. en demandant
if(isOnline()){
Vous obtenez s'il y a une connexion et s'il peut se connecter à une page le code d'état
200
(connexion stable).Assurez - vous d'ajouter le bon
INTERNET
et lesACCESS_NETWORK_STATE
autorisations.la source
Cela fonctionne pour moi:
Pour vérifier la disponibilité du réseau:
Pour vérifier l'accès à Internet:
la source
Il y a plus d'une façon
Premier moyen, le plus court mais inefficace
Autorisation de l'état du réseau uniquement nécessaire
Ensuite, cette méthode,
Comme on le voit dans les réponses
ConnectivityManager
est une solution, je viens de l'ajouter dans une méthode c'est une méthode simplifiée tout usageConnectivityManager
renvoie vrai s'il y a un accès réseau pas un accès Internet, signifie que votre WiFi est connecté à un routeur mais que le routeur n'a pas Internet il renvoie vrai, il vérifie la disponibilité de la connexionDeuxièmement, manière efficace
État du réseau et autorisations Internet nécessaires
Ensuite, cette classe,
Appel
CheckInternetAsyncTask
Quelques explications: -
vous devez vérifier Internet
AsyncTask
, sinon il peut jeterandroid.os.NetworkOnMainThreadException
dans certains casConnectivityManager
utilisé pour vérifier l'accès au réseau si true envoie une demande (Ping)Request send to
http://clients3.google.com/generate_204
, Cette URL bien connue est connue pour renvoyer une page vide avec un état HTTP 204, c'est plus rapide et plus efficace quehttp://www.google.com
, lisez ceci . si vous avez un site Web, il est préférable de mettre votre site Web au lieu de Google, uniquement si vous l'utilisez dans l'applicationLe délai d'attente peut être changé de plage (20 ms -> 2000 ms), 1500 ms est couramment utilisé
la source
De tout ce que j'ai vu jusqu'à présent, le moyen le plus court et le plus propre devrait être:
PS: Cela ne fait pas de ping sur aucun hôte, il vérifie simplement l'état de la connexion, donc si votre routeur n'a pas de connexion Internet et que votre appareil y est connecté, cette méthode retournerait vraie bien que vous n'ayez pas d'Internet.
Pour un test réel, je recommanderais d'exécuter une demande HttpHead (par exemple à www.google.com) et de vérifier l'état, si son 200 OK tout va bien et que votre appareil dispose d'une connexion Internet.
la source
Voici la méthode que j'utilise:
Encore mieux, vérifiez qu'il est "connecté":
Voici comment utiliser la méthode:
Autorisation nécessaire:
https://stackoverflow.com/a/16124915/950427
la source
Un cas d'utilisation important sur les appareils mobiles pour garantir l'existence d'une connexion réelle. Il s'agit d'un problème courant lorsqu'un utilisateur mobile pénètre dans un réseau Wifi avec un "portail captif", dans lequel il doit se connecter. J'utilise cette fonction de blocage en arrière-plan pour garantir l'existence d'une connexion.
la source
Vous pouvez parcourir toutes les connexions réseau et vérifier s'il y a au moins une connexion disponible:
la source
Pour moi, ce n'était pas une bonne pratique de vérifier l'état de la connexion dans la classe Activity, car
doit être appelé là, ou vous devez pousser votre instance d'activité (contexte) vers la classe du gestionnaire de connexion pour pouvoir vérifier l'état de la connexion là-bas. Lorsqu'aucune connexion disponible (wifi, réseau) j'attrape l' exception UnknownHostException :
De cette façon, je peux gérer ce cas avec les autres cas de la même classe (mon serveur répond toujours en retour avec une chaîne json)
la source
Ça marche pour moi. Essaye le.
la source
Cette méthode vous donne la possibilité d'une méthode très rapide (pour la rétroaction en temps réel) ou d'une méthode plus lente (pour les contrôles ponctuels qui nécessitent de la fiabilité)
la source
Im utilisant ce code au lieu de InetAddress:
la source
Il n'est pas complexe de vérifier l'état de la connectivité réseau / Internet Android. Le cours ci
DetectConnection
- dessous vous aidera à vérifier ce statut:Pour plus de détails, consultez Comment vérifier l'état du réseau Android / de la connectivité Internet
la source
Meilleure approche:
la source
Voici le code de ma
Utils
classe:la source
la source
Vous pouvez utiliser cette méthode pour détecter la disponibilité du réseau-
la source
J'ai appliqué la solution fournie par @Levit et créé une fonction qui n'appellera pas la demande Http supplémentaire.
Cela résoudra l'erreur
Unable to Resolve Host
Maintenant, appelez ça comme,
la source
Ceci est couvert dans les documents Android http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
la source
J'ai parcouru toutes les réponses et je trouve ma propre réponse qui vérifie d'abord si Internet est disponible et si Internet est disponible, puis il vérifie s'il est actif ou non.
J'ai inclus toutes les méthodes et classes nécessaires pour vérifier la connexion Internet active.
NetworkUtils.class
Vous pouvez vérifier si Internet est actif en utilisant le code ci-dessous:
la source
Très important de vérifier si nous avons une connectivité avec isAvailable () et s'il est possible d'établir une connexion avec isConnected ()
et vous pouvez déterminer le type de réseau WiFi actif :
ou Móvil mobile :
n'oubliez pas les autorisations:
la source
Kotlin et coroutines
J'ai placé la fonction dans un
ViewModel
, qui a leviewModelScope
. En utilisant un observableLiveData
j'informe une activité sur la connexion.ViewModel
Activité
la source
Créez simplement la classe suivante qui vérifie une connexion Internet:
Cette classe contient simplement une méthode qui renvoie la valeur booléenne de l'état de la connexion. Par conséquent, en termes simples, si la méthode trouve une connexion valide à Internet, la valeur de retour est
true
, sinonfalse
si aucune connexion valide n'est trouvée.La méthode suivante dans MainActivity appelle ensuite le résultat de la méthode décrite précédemment et invite l'utilisateur à agir en conséquence:
Dans le code ci-dessus, si le résultat est faux (par conséquent, il n'y a pas de connexion Internet, l'utilisateur est redirigé vers le panneau Wi-Fi Android, où il est invité à se connecter à un point d'accès Wi-Fi.
la source
Mise à jour 29/06/2015 Si vous utilisez Xamarin.Android et souhaitez vérifier la connectivité, vous pouvez utiliser un package Nuget qui vous offrirait cette fonctionnalité sur plusieurs plates-formes. Les bons candidats sont ici et ici . [Fin de la mise à jour]
Les réponses ci-dessus sont assez bonnes, mais elles sont toutes en Java et presque toutes vérifient une connectivité. Dans mon cas, je devais avoir une connectivité avec un type de connexion spécifique et je développe sur Xamarin.Android. De plus, je ne passe pas de référence à mes activités Contexte dans la couche Matériel, j'utilise le Contexte d'application. Voici donc ma solution, au cas où quelqu'un viendrait ici avec des exigences similaires. Je n'ai pas fait de test complet cependant, mettra à jour la réponse une fois mes tests terminés
la source