Si la conexión HTTP no agota el tiempo de espera, puede implementar el verificador de tiempo de espera en el hilo de fondo (AsyncTask, Service, etc.), la siguiente clase es un examen PLE para Personalizar AsyncTask que el tiempo de espera 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 este
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;
};
}
Configuré el valor en 10 minutos. Sin embargo, me arroja una 'java.net.ConnectException: La conexión ha expirado: conecte' antes incluso de que hayan transcurrido 2 minutos. ¿Sabes lo que está causando el problema? – Pacerier
@dbyrne esto me parece un poco confuso, ya que establecemos el tiempo de espera después de que se crea el objeto 'HttpURLConnection', me pregunto cuál es el lugar exacto en el código que levantará' SocketTimeoutException'? – Less
SocketTimeoutException es una subclase de IOException. Si ambos bloques de capturas hacen lo mismo, podrías atrapar IOException. – spaaarky21