Configuración del tiempo de espera de HttpURLConnection


Quiero devolver false si la URL tarda más de 5 segundos en conectarse - ¿cómo es posible esto usando Java? Aquí está el código que estoy usando para comprobar 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);
Author: Michael, 2010-05-10

4 answers

HttpURLConnection tiene un método setConnectTimeout .

Simplemente establece el tiempo de espera en 5000 milisegundos, y luego captura java.net.SocketTimeoutException

Su código debería verse algo como esto:


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;
}


 168
Author: dbyrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-10 02:07:56

Puede establecer el tiempo de espera de esta manera,

con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);
 94
Author: ZZ Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-10 02:01:34

Si la conexión HTTP no agota el tiempo de espera, puede implementar el comprobador de tiempo de espera en el subproceso en segundo plano (AsyncTask, Service, etc.), la siguiente clase es un ejemplo para Personalizar AsyncTask que agota el tiempo 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;
    };
 }
 1
Author: Ayman Mahgoub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-22 13:57:29

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

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

Mi requisito era conocer el código de respuesta y para eso solo obtener la meta-información era suficiente, en lugar de obtener el cuerpo de respuesta completo.

El método de solicitud predeterminado es GET y que estaba tomando mucho tiempo para regresar, finalmente me lanzó SocketTimeoutException. La respuesta fue bastante rápida cuando configuré el método de solicitud para HEAD.

 0
Author: Subrata Nath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-28 13:23:31