java openstream timeout
HttpURLConnection configuraciĆ³n de tiempo de espera (4)
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);
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.
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<Params, Progress, Result> extends
AsyncTask<Params, Progress, Result> {
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<Void, Void, Void> {
@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;
};
}
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;
}