HttpURLConnection configuración de tiempo de espera

Quiero devolver falso si la URL tarda más de 5 segundos en conectarse. ¿Cómo es posible usar Java? Aquí está el código que estoy usando para verificar si la URL es válida

HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setRequestMethod("HEAD"); return (con.getResponseCode() == HttpURLConnection.HTTP_OK); 

HttpURLConnection tiene un método setConnectTimeout .

Simplemente configure el tiempo de espera en 5000 milisegundos, y luego capture java.net.SocketTimeoutException

Tu código debería verse más o menos así:

try { HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setRequestMethod("HEAD"); con.setConnectTimeout(5000); //set timeout to 5 seconds return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (java.net.SocketTimeoutException e) { return false; } catch (java.io.IOException e) { return false; }
try { HttpURLConnection.setFollowRedirects(false); HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); con.setRequestMethod("HEAD"); con.setConnectTimeout(5000); //set timeout to 5 seconds return (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (java.net.SocketTimeoutException e) { return false; } catch (java.io.IOException e) { return false; } 

Puede establecer un tiempo de espera como este,

 con.setConnectTimeout(connectTimeout); con.setReadTimeout(socketTimeout); 

Si la conexión HTTP no agota el tiempo de espera, puede implementar el verificador de tiempo de espera en el subproceso en segundo plano (AsyncTask, Servicio, etc.), la siguiente clase es un ejemplo para Personalizar AsyncTask, que expira después de cierto período

 public abstract class AsyncTaskWithTimer extends AsyncTask { private static final int HTTP_REQUEST_TIMEOUT = 30000; @Override protected Result doInBackground(Params... params) { createTimeoutListener(); return doInBackgroundImpl(params); } private void createTimeoutListener() { Thread timeout = new Thread() { public void run() { Looper.prepare(); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if (AsyncTaskWithTimer.this != null && AsyncTaskWithTimer.this.getStatus() != Status.FINISHED) AsyncTaskWithTimer.this.cancel(true); handler.removeCallbacks(this); Looper.myLooper().quit(); } }, HTTP_REQUEST_TIMEOUT); Looper.loop(); } }; timeout.start(); } abstract protected Result doInBackgroundImpl(Params... params); } 

Una muestra para esto

 public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer { @Override protected void onCancelled(Void void) { Log.d(TAG, "Async Task onCancelled With Result"); super.onCancelled(result); } @Override protected void onCancelled() { Log.d(TAG, "Async Task onCancelled"); super.onCancelled(); } @Override protected Void doInBackgroundImpl(Void... params) { // Do background work return null; }; } 

Podría obtener una solución para un problema similar con la adición de una línea simple

 HttpURLConnection hConn = (HttpURLConnection) url.openConnection(); hConn.setRequestMethod("HEAD"); 

Mi requerimiento era conocer el código de respuesta y para eso bastaba con obtener la metainformación, en lugar de obtener el cuerpo completo de la respuesta.

El método de solicitud predeterminado es GET y tardaba mucho tiempo en regresar, finalmente lanzándome SocketTimeoutException. La respuesta fue bastante rápida cuando establecí el método de solicitud en HEAD.