2011-12-20 14 views
8

Tengo una aplicación de Android que se conecta a Internet. Estoy atrapando todos los escenarios posibles para la conexión y aviso que cuando no tengo una conexión a Internet, un UnknownHostException es thrown. Estoy un poco confundido aquí ya que obtener un UnknownHostException significará que la aplicación pudo conectarse a Internet pero no pudo encontrar la URL dada.Error de conexión a Internet

¿Estoy recibiendo la excepción correcta? ¿Podría explicar por qué recibo un UnknownHostException en esto?

Además, se puede saber las excepciones específicas para estos escenarios:

  • Cuando no hay conexión a Internet.
  • Cuando no se puede encontrar la URL.
  • Cuando se agotó el tiempo de espera de la solicitud.
  • Cuando el sitio web está caído.
  • Cuando se deniega el acceso.

También te agradecería que me dieras más ejemplos y excepciones. Debo atrapar todas las conexiones posibles y mostrar el mensaje más apropiado según el tipo de error de conexión.

+0

buena pregunta + 1 –

+0

si está intentando conectarse localhost de su emulador que tiene que dar como 10.0.2.2. – sampathpremarathna

Respuesta

11

obteniendo un UnknownHostException significa que la aplicación era capaz de conectarse a Internet

No, no lo hace. Significa que la aplicación no pudo resolver el nombre de host. Eso podría deberse a que el nombre de host no existe o porque no pudo conectarse a Internet para resolverlo.

Cuando no hay conexión a Internet.

Sin excepción específica. "No hay conexión a Internet" no tiene un significado bien definido. La condición se resuelve a uno de los otros modos de falla a continuación.

Cuando no se puede encontrar la URL.

Si el anfitrión no se puede encontrar, UnknownHostException. Si no se puede encontrar la parte de contenido de la URL, HTTP 404.

Cuando se agotó el tiempo de espera de la solicitud.

ConnectException con 'el tiempo de conexión' como el mensaje, o SocketTimeoutException si se trata de un tiempo de espera de lectura.

Cuando el sitio web está caído.

ConnectException con 'connection refused' como el mensaje.

Cuando se deniega el acceso.

HTTP 403.

+0

¡Gracias! Entonces, ¿no hay forma de determinar si una excepción se debe a una falta de conexión a Internet? – Arci

+0

Ya he respondido eso. La condición 'falta de conexión a Internet' en sí misma no tiene un significado bien definido, pero se resuelve en una de las tres excepciones que enumeré cuando lo dije. – EJP

2

para comprobar la conectividad a Internet ....

boolean b_IsConnect = isNetworkAvailable(); 
private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager 
       .getActiveNetworkInfo(); 
     return activeNetworkInfo != null; 
    } 
4

comprobación de la conexión a Internet, sólo tratar esta función de ejemplo ....

public static boolean CheckInternet(Context context) 
{ 
    ConnectivityManager connec = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    android.net.NetworkInfo wifi = connec.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    android.net.NetworkInfo mobile = connec.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    return wifi.isConnected() || mobile.isConnected(); 
} 

espero que esta ayuda ....

+0

No tiene sentido probar 'mobile.isConnected()' dos veces, etc. Todo esto se puede reducir a una línea: 'return wifi.isConnected() || mobile.isConnected() '. – EJP

+0

¡Gracias! También estoy planeando implementar un método de comprobación similar si la excepción lanzada no será suficiente para determinar si no hay conexión a Internet. – Arci

+0

eres bienvenido. Si ayudas mi respuesta, entonces vota por ella. – Uttam

1

para comprobar la conexión a Internet, utilice esta función.

public boolean isConnectingToInternet(){ 
    ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) 
     { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) 
        { 
         return true; 
        } 
     } 
     return false; 
} 
Cuestiones relacionadas