Параметры тайм-аута 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 ответа:
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.