2010-04-14 4 views
10

Я пытаюсь загрузить большой файл из Интернета (> 20Mb)Android: скачать большой файл

private class DownloadTask extends AsyncTask<DatabaseInfo, Integer, String> { 

    private DatabaseInfo info; 

    protected String doInBackground(DatabaseInfo... dbInfo) { 

     int count; 
     info = dbInfo[0]; 

     try { 

      URL url = new URL(dbInfo[0].dbPath); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/db.zip"); 

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

      while ((count = input.read(data)) != -1) { 

       //output.write(data, 0, count); 

       total += count; 

       if (total % 10240 == 0) { 
        publishProgress(total); 
       } 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } 
     catch (Exception e) { 
      Log.e("err", e.getMessage()); 
     } 

     return null; 
    } 

    protected void onProgressUpdate(Integer... total) { 

     int perc = (int) ((float) total[0]/(float) info.dbZipSize * 100); 
     mProgressDialog.setProgress(perc); 
    } 

    protected void onPostExecute(String s) { 

     dismissDialog(DIALOG_PROGRESS); 
     Log.e("err", "finish!"); 
    } 
} 

Если я раскомментировать линии

//output.write(data, 0, count); 

после 7-15% диалога загрузки прогрессбара сбрасывать со счетами и Я вижу «закончить!» в журнале. Зачем?

+0

Вы пробовали его в устройстве или эмуляторе ?? если вы попробовали его в эмуляторе, тогда он не работает должным образом. потому что вам нужна высокая конфигурация системы. – Praveen

+0

эмулятор. хорошо, я попробую на устройстве – embo

+0

да, на устройстве хорошо работать! – embo

ответ

5

Вы должны посмотреть на реализацию HTTP-диапазонов. Это позволит вам повторно запустить загрузку, когда она не удалась.

Что касается причин, по которым он останавливается, некоторые перевозчики реализуют ограничения на загрузку, которые потеряют соединение после определенного времени или суммы загрузки. Я видел эту первую руку на одном британском перевозчике, и об этом говорили другие. Как правило, легко проверить предел, пытаясь загрузить файл через браузер Androids, и если вы увидите его срыв или прекратите понимать, что это скорее всего проблема с перевозчиком (и да, загрузка может быть прекращена без выброса исключения).

Реализация Http Range позволит вам продолжить загрузку с того места, где она остановилась, и, таким образом, ваш метод doInBackground использовать алгоритм ожидания и возобновления, так что каждый раз, когда соединение прерывается, вы ждете времени, а затем попробуйте возобновить работу, когда загрузка осталась (и, конечно же, реализовать предел повтора, чтобы вы не закончили бесконечный цикл, когда телефон действительно не может загрузить файл).

Смежные вопросы