Impostazioni timeout HttpURLConnection

Voglio restituire false se l’URL richiede più di 5 secondi per connettersi: come è ansible utilizzare Java? Ecco il codice che sto usando per verificare se l’URL è valido

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

HttpURLConnection ha un metodo setConnectTimeout .

Basta impostare il timeout su 5000 millisecondi e quindi catturare java.net.SocketTimeoutException

Il tuo codice dovrebbe apparire in questo modo:

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

Puoi impostare un timeout come questo,

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

Se la connessione HTTP non ha scadenza, è ansible implementare il controllo di timeout nel thread in background (AsyncTask, Service, ecc.), La seguente class è un esempio per Custom AsyncTask che timeout dopo un certo periodo

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

Un esempio per questo

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

Potrei ottenere una soluzione per un problema simile con l’aggiunta di una linea semplice

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

Il mio requisito era quello di conoscere il codice di risposta e per questo solo ottenere la meta-informazione era sufficiente, invece di ottenere il corpo di risposta completo.

Il metodo di richiesta di default è GET e ci è voluto molto tempo per tornare, gettandomi infine SocketTimeoutException. La risposta è stata piuttosto veloce quando ho impostato il metodo di richiesta su HEAD.