2013-09-24 3 views
0

У меня есть асинхронный метод, который позволяет загружать файлы. Если в середине загрузки я удаляю соединение (wifi или 3g), тайм-аут никогда не возникает.Как и почему не запускать «тайм-аут» на URLConnection (DownloadFile)?

Всегда оставаться в следующем цикле ждет возвращения соединения:

while ((count = input.read(data)) != -1) { 
     System.out.println("state 5"); 
     total += count; 
     publishProgress((int) (total * 100/fileLength)); 
     output.write(data, 0, count); 
} 

я:

private class DownloaderFile extends AsyncTask<String, Integer, String> { 
     @Override 
     protected String doInBackground(String... params) { 
      ... 
      try{ 
       URLConnection connection = urlFinal.openConnection(); 
       connection.setConnectTimeout(TIMEOUT_VALUE); 
       connection.setReadTimeout(TIMEOUT_VALUE); 
       connection.connect(); 
       int fileLength = connection.getContentLength(); 

       InputStream input = new BufferedInputStream(urlFinal.openStream()); 

       OutputStream output = new FileOutputStream(folder + params[0]); 

       byte data[] = new byte[1024]; 
       long total = 0; 
       int count; 

       while ((count = input.read(data)) != -1) { 
//always wait here 
        System.out.println("state 5"); 
        total += count; 
        publishProgress((int) (total * 100/fileLength)); 
        output.write(data, 0, count); 
       } 

       output.flush(); 
       output.close(); 
       input.close(); 
      } catch (SocketTimeoutException e) { 
       System.out.println("TIMEOUT!!! " + TIMEOUT_VALUE + " elapsed."); 
       callback.onDownloadEnd(DOWNLOAD_ERROR); 
      } 
      ... 
     } 
     ... 
+0

Этот вопрос был задан ранее, но не включает в себя немного о том, на Wi-Fi: http://stackoverflow.com/q/3163693/42962 Я рекомендую следуя советам на эту должность: http://stackoverflow.com/a/7611294/42962 Пожалуйста, позвоните getReadTimeout() и getConnectTimeout(), чтобы даже увидеть, будут ли объекты, которые вы пытаетесь установить, даже принимаются объектом. – hooknc

ответ

0

Я подозреваю SocketTimeoutException является неправильным исключением искать как соединение correcty установлено в ваш тест, что, если вы измените его на Исключение? Просто чтобы посмотреть, поможет ли это.

Я могу видеть из: How to set HttpResponse timeout for Android in Java, что я ошибся.

Из информации, я связался я обнаружил, что вы, вероятно, необходимо установить:

// Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data. 
    int timeoutSocket = 5000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 
+1

Я попытался с: '... } поймать (Exception е) {\t \t \t \t \t System.out.println ("тайм-аут ошибка"); callback.onЗагрузитьEnd (DOWNLOAD_ERROR); } ' Но это исключение не работает. – ephramd

+1

Это решение - использовать http-запросы, я использую его в других случаях, и таймаут работает отлично. Проблема заключается в приведенном выше коде с URLConnection, который позволяет загружать файл (например, MP3). – ephramd

0

Какой бы ни была причина, может быть, я не буду гадать, когда 3g/WiFi больше не доступен поток, который читает из сокета заблокирован ,

Один из подходов, который вы можете предпринять, состоит в том, чтобы выполнить сокет, прочитанный в отдельном потоке, и использовать метод Thread.join(long millis), чтобы подождать до максимального миллисекунды для его завершения.

Thread t = new Thread(new Runnable() { 
      void run() { 
       ... 
       while ((count = input.read(data)) != -1) { 
       ... 
       } 
       ... 
      } 
      }).start(); 

t.join(TIMEOUT_VALUE); // will wait here until either the thread t is done or times out 
+1

Это не решение, в зависимости от скорости соединения, файл может занять некоторое время, чтобы загрузить, я не знаю времени и поэтому бесполезен. – ephramd

+0

Итак, почему вы даже беспокоитесь о том, что ваш код перейдет в таймаут? Предпосылка здесь - вы ожидаете, что время ожидания произойдет, если загрузка займет больше времени, чем вы ожидали? – gerrytan

1

Это отличное решение, но оно работает. Хотя я думаю, что другого решения ...

while ((count = input.read(data)) != -1) { 
    if (!isInternet(context)){ 
     callback.onDownloadEnd(DOWNLOAD_ERROR); 
     return "error"; 
    } 
    total += count; 
    publishProgress((int) (total * 100/fileLength)); 
    output.write(data, 0, count); 
}