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í:
- Uso de Scala con Java en Android Studio
- Obtener el nombre del idioma en ese idioma desde el código de idioma
- ¿Por qué el SDK de Android necesita un JDK?
- Portar clases y métodos Java a Android. (TextLayout, Font, Graphics2D, y más)
- Parsing data for Android L failed.Unsupported major.minor versión 51.0
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.
- Android construir dibujo bug cashe
- Cómo cambiar popupwindow z-index android
- Deshabilitar vínculos de WebView funciona en el emulador pero no en el dispositivo
- No se puede realizar la operación porque no hay ninguna transacción actual al insertar en la base de datos
- Proyecto androide tiene x rojo, pero no hay errores en el código
- Convención de nombres de campos de vista de Android
- ¿Por qué RecyclerView onBindViewHolder se llama una sola vez?
- ¿Cómo utilizar otro servicio de reconocimiento de voz en mi dispositivo Nexus 5?
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
- Ir a la ventana de eclipse-> preferencias-> Android-> DDMS y aumentar el tiempo de espera de conexión ADB.
- Cómo utilizar el token de acceso de Facebook en la vista de la aplicación de Android
- SetShadowLayer Diferencias de la API de Android