Tuve un problema similar - porque el HttpUrlConnection won't time out mid-download. Por ejemplo, si apaga el wifi cuando la descarga se realiza, el mío continúa diciendo que está descargando, atascado en el mismo porcentaje.
Encontré una solución, usando un TimerTask, conectado a un AsyncTask llamado DownloaderTask. Proveedores:
class Timeout extends TimerTask {
private DownloaderTask _task;
public Timeout(DownloaderTask task) {
_task = task;
}
@Override
public void run() {
Log.w(TAG,"Timed out while downloading.");
_task.cancel(false);
}
};
A continuación, en el circuito de descarga real establece un temporizador para tiempo de espera de error:
_outFile.createNewFile();
FileOutputStream file = new FileOutputStream(_outFile);
out = new BufferedOutputStream(file);
byte[] data = new byte[1024];
int count;
_timer = new Timer();
// Read in chunks, much more efficient than byte by byte, lower cpu usage.
while((count = in.read(data, 0, 1024)) != -1 && !isCancelled()) {
out.write(data,0,count);
downloaded+=count;
publishProgress((int) ((downloaded/ (float)contentLength)*100));
_timer.cancel();
_timer = new Timer();
_timer.schedule(new Timeout(this), 1000*20);
}
_timer.cancel();
out.flush();
Si el tiempo de espera, y no se descarga incluso 1K en 20 segundos, se cancela en lugar de que parece estar siempre descargando.
dos cosas para su consideración. Si no desea que su aplicación se cuelgue, coloque su método de conexión en un hilo separado. En segundo lugar, dijiste que "funcionó" perfectamente, ¿qué estás haciendo para simular una mala conexión? – Otra
@Otra Lo tengo en un hilo separado utilizando un diálogo de progreso. Lo que básicamente sucede es que si la conexión es buena, la tarea hace lo suyo. Pero si la conexión es mala, el progreso del diálogo permanece alto durante años. Para simular una mala conexión, estoy reduciendo el tiempo de espera. En lugar de darle 15 segundos, 1 segundo.Solo para probar. ¿O es eso incorrecto? –
HttpURLConnection.setReadTimeout (mili sec); –