Comment vérifier l'accès à internet sur Android? InetAddress n'arrive jamais à expiration

J'ai eu un AsyncTask qui est censé vérifier l'accès au réseau à un nom d'hôte. Mais le doInBackground() n'est jamais dépassé. 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();
    }   
}
  • Pour vérifier la présence d'une connexion internet, probablement le moyen le plus fiable serait de ping l'un des principaux serveurs de noms, ce qui pourrait être fait par exemple avec 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 cette. Btw la accepté de répondre (et beaucoup d'autres ici) il suffit de cocher pour un connexion réseau, pas sur internet.
  • voir-> stackoverflow.com/a/4239019/1815624
  • Ne pas utiliser la table de ping méthode, utilisez un HTTP vérifier à la place. ICMP est bloqué sur certains réseaux, de sorte que le ping ne fonctionne pas. E. g.: il fonctionne parfaitement sur mon wifi à la maison, mais il ne fonctionne pas quand je suis à l'aide de données mobiles sur Vodafone réseau (en Hongrie). Ou combiner les 2 méthodes comme un secours, mais être prudent, car waitFor() doit attendre environ 20 secondes, même si -w -W est utilisé.
  • Découvrez ceci: stackoverflow.com/a/39766506/3806413
  • Encore mieux serait de s'attaquer à la couche tcp. Ce qui devrait vous conduire à proximité de la vitesse d'un ICMP, avec la fiabilité d'une requête HTTP. J'ai édité le "ping réponse" en conséquence.