Miałem podobny problem - ponieważ do pobrania jest średnio HttpUrlConnection won't time out. Na przykład, jeśli wyłączysz Wi-Fi, gdy pobieranie się rozpocznie, moje nadal mówi, że pobiera, zablokowane w tym samym procencie.
Znalazłem rozwiązanie, używając TimerTask, podłączony do AsyncTask o nazwie DownloaderTask. Spróbuj:
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);
}
};
Następnie w pętli faktycznego pobierania ustawienie czasu Timeout-błędu:
_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();
Jeśli to czasy, i nie będzie pobierał nawet 1K w 20 sekund, to anuluje zamiast wydaje się być na zawsze pobieranie.
dwie rzeczy do rozważenia. Jeśli nie chcesz, aby aplikacja się zawiesiła, umieść metodę połączenia w osobnym wątku. Po drugie, powiedziałeś, że to "działa" idealnie, co robisz, aby symulować złe połączenie? – Otra
@Otra Mam go w osobnym wątku za pomocą progressdialog. Zasadniczo dzieje się tak, że jeśli połączenie jest dobre, zadanie wykonuje swoje zadanie. Ale jeśli połączenie jest złe, progressdialog pozostaje na wieki. Aby zasymulować nieprawidłowe połączenie, ograniczam limit czasu. Zamiast dawać mu 15 sekund, 1 sekundę.Tylko do testowania. Czy to źle? –
HttpURLConnection.setReadTimeout (mili sec); –