Android UnknownHostException: ¿hay una manera de establecer el tiempo de espera?

Cuando me conecto a mi webservice para recobrar datos, el teléfono a veces se desconecta, DNS desordenado, etc Entonces me sale una UnknownHostException que está perfectamente bien.

Lo que quiero hacer es establecer un tiempo de espera al buscar el hostName aquí:

  response = httpclient.execute(httpget); 

Ya he establecido:

 HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection); HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

Pero no parecen aplicar para HostLookUp . ¿Hay alguna manera de establecer el tiempo de espera en la búsqueda de host?

Editar
Acabo de encontrar que el usuario no puede modificar el tiempo de espera de nslookup en esta entrada en la lista de correo de hc-dev .

Voy a tener que lanzar manualmente una excepción de tiempo de espera de un temporizador en ese momento.

En primer lugar HttpParams httpParams = new BasicHttpParams () es depricated, use este HttpURLConnection conn = (HttpURLConnection) url.openConnection ();

Cuando el tamaño de los parámetros mayores de 2 MB a continuación, el servidor dar tiempo de respuesta.

Compruebe el tamaño de los parámetros y háganmelo saber.

Prueba esto

 public class MyAsync extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String... arg0) { HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. int timeoutConnection = 3000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 5000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient client=new DefaultHttpClient(httpParameters); HttpGet get=new HttpGet(arg0[0]); try { HttpResponse response=client.execute(get); HttpEntity ent=response.getEntity(); String res=EntityUtils.toString(ent); Log.d("Nzm", res); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } 

}

 DefaultHttpClient client = new DefaultHttpClient(); HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. int timeoutConnection = 30000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // HttpConnectionParams.setHeader("Accept", "application/json"); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 30000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); client.setParams(httpParameters); 

Será mejor si utiliza el enhebrado para las operaciones de red, entonces usted puede dar un tiempo de espera externally.I había utilizado este método para resolver el problema en la definición de tiempo de espera no estaba funcionando.

En este método, los códigos de comunicaciones posteriores se escriben en un Handler. Podemos activar este controlador enviando un mensaje (también podemos pasar datos a través de mensajes). Las declaraciones de activación se escriben en un temporizador de cuenta atrás y después de los códigos de comunicación en el hilo. El código necesario se escribe en el controlador para desactivar más el disparo (asignando un nuevo manipulador vacío al objeto).

Si te gusta esta lógica y requiere más explicación. Por favor comente abajo

Usted podría intentar algo como: –

 URLConnection connection = null; connection = address.openConnection(); post = (HttpsURLConnection) connection; post.setSSLSocketFactory(context.getSocketFactory()); post.setDoInput(true); post.setDoOutput(true); // Connecting to a server will fail with a SocketTimeoutException if the timeout elapses before a connection is established post.setConnectTimeout(Const.CONNECTION_TIMEOUT_DELAY); post.setRequestMethod("POST"); // throws ProtocolException post.setRequestProperty("soapaction",""); post.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); post.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(strCredentials.getBytes(), Base64.NO_WRAP)); post.setRequestProperty("Content-Length", String.valueOf(requestEnvelope.length())); 

// La lectura fallará con una SocketTimeoutException si el tiempo de espera transcurre antes de que los datos estén disponibles .. post.setReadTimeout (Const.READ_TIMEOUT_DELAY);

Para mí el tiempo de espera no se utilizó si perdimos la conexión (para probar: apagar el WiFi). Así que escribí un método que intenta descargar el archivo hasta X veces, esperando milisegundos Y entre cada intento:

 public static byte[] getByteArrayFromURL(String url, int maxTries, int intervalBetweenTries) throws IOException { try { return Utils.getByteArrayFromURL(url); } catch(FileNotFoundException e) { throw e; } catch(IOException e) { if(maxTries > 0) { try { Thread.sleep(intervalBetweenTries); return getByteArrayFromURL(url, maxTries - 1, intervalBetweenTries); } catch (InterruptedException e1) { return getByteArrayFromURL(url, maxTries -1, intervalBetweenTries); } } else { throw e; } } } 

Aquí está el método que descarga el archivo y lanza el UnknownHostException:

 public static byte[] getByteArrayFromURL(String urlString) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream in = null; try { in = new URL(urlString).openStream(); byte[] byteChunk = new byte[BUFFER_SIZE]; int n; while ((n = in.read(byteChunk)) > 0) { out.write(byteChunk, 0, n); } } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return out.toByteArray(); } 

Ahora, si el archivo que desea descargar no existe, el método fallará inmediatamente, de lo contrario si se lanza una IOException (como la excepción UnknownHostException), se reintentará, hasta "maxTries", esperando "intervalBetweenTries" entre cada intento .

Por supuesto, usted debe utilizar esto asincrónicamente.

Me parece Volley (yo diría que el reemplazo de AsyncTask) biblioteca es más fácil de usar y también da menos bugs. Si utiliza volley, es más fácil administrar los tiempos de espera. Sin embargo, con respecto a su pregunta,

  response = httpclient.execute(httpget); 

Con esto supongo que estás usando AsyncTask. Hay una opción a settimeout() en httpconnection también, pero que no funciona correctamente debido a su problema con DNS. Así que intente usar runnable() y settime. He utilizado este enfoque en uno de mi proyecto, camino de regreso cuando no se utiliza Volley todavía.

Espero que eso ayude.

Pruebe este, puede ser que será de ayuda para usted.

 final HttpParams httpParams = new BasicHttpParams() HttpConnectionParams.setConnectionTimeout(httpParams, 1000) HttpConnectionParams.setSoTimeout(httpParams, 30000) HttpClient hc = new DefaultHttpClient(httpParams) try { HttpGet get = new HttpGet("http://www.google.com") HttpResponse response = hc.execute(get) take your response now. 

}

Debería usar algo como esto:

 /** * Check availability of web service * * @param host Address of host * @param seconds Timeout in seconds * @return Availability of host */ public static boolean checkIfURLExists(String host, int seconds) { HttpURLConnection httpUrlConn; try { httpUrlConn = (HttpURLConnection) new URL(host).openConnection(); // Set timeouts in milliseconds httpUrlConn.setConnectTimeout(seconds * 1000); httpUrlConn.setReadTimeout(seconds * 1000); // Print HTTP status code/message for your information. System.out.println("Response Code: " + httpUrlConn.getResponseCode()); System.out.println("Response Message: " + httpUrlConn.getResponseMessage()); return (httpUrlConn.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); return false; } } 

Por favor, descargue este archivo Jar e importe en la carpeta lib http://grepcode.com/snapshot/repo1.maven.org/maven2/org.apache.httpcomponents/httpmime/4.2.1 y siga ejecutando su aplicación .. Su código es correcto

Puede enviar la solicitud de ping a su servidor y establecer el tiempo de espera para la solicitud de ping. Si es cierto que tiene conexión a Internet, si es falsa no hacer nada. El código debería tener este aspecto:

 public static boolean connection() throws UnknownHostException, IOException { String ipAddress = "94.103.35.164"; InetAddress inet = InetAddress.getByName(ipAddress); if(inet.isReachable(1000)){ return true; } else { return false; } } 

Puede cambiar su tiempo de espera en este ejemplo. He establecido un segundo de tiempo de espera.

Sí se puede establecer el tiempo de espera siga estos pasos

  1. Ir a la ventana de eclipse-> preferencias-> Android-> DDMS y aumentar el tiempo de espera de conexión ADB.
  • ¿Qué es List <?> En Java (Android)?
  • Java MTP biblioteca que funciona en Windows
  • NullPointerException con aceleración de hardware activada?
  • Obtener el nombre de contacto dado un número de teléfono en Android
  • Explicación sobre controltransfer en android para configurar la comunicación USB
  • ¿Está segura la manipulación de bytecode?
  • Android recibe texto de html
  • El recurso colors.xml no funciona
  • Clase genérica con acceso de restricción
  • Insertar} para completar el error de ClassBody incluso con paréntesis coincidentes
  • Ráfaga de captura de cámara de Android2 es demasiado lento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.