Параметры тайм-аута HttpURLConnection


Я хочу вернуть false, если URL-адрес занимает более 5 секунд для подключения - как это возможно с помощью Java? Вот код, который я использую, чтобы проверить, если URL действителен

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

4 ответа:

HttpURLConnection есть setConnectTimeout метод.

всего установить тайм-аут до 5000 миллисекунд, а затем поймать java.net.SocketTimeoutException

ваш код должен выглядеть примерно так:


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


вы можете установить тайм-аут, как это,

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

Если HTTP-соединение не тайм-аут, вы можете реализовать проверку тайм-аута в самом фоновом потоке (AsyncTask, Service и т. д.), следующий класс является примером для настройки AsyncTask, который тайм-аут после определенного периода

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

образец для этого

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 hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");

моим требованием было знать код ответа, и для этого было достаточно просто получить метаинформацию, а не получить полное тело ответа.

метод запроса по умолчанию-GET, и это заняло много времени, чтобы вернуться, наконец, бросив мне SocketTimeoutException. Ответ был довольно быстрым, когда я установил метод запроса в HEAD.