2012-05-19 2 views
1

В моем приложении мне нужно скачать кучу файлов. В моем первоначальном плане использовался отдельный AsyncTask для каждого файла, поэтому я могу уведомить остальную часть приложения, когда загружается каждый файл. Я обнаружил, что он тестирует, что, хотя это работает, кажется, что он действительно неэффективен в работе. Есть ли хороший способ использовать одну AsyncTask или, возможно, службу для загрузки файлов и уведомления о каждом файле?Android: правильный способ загрузки большого количества файлов

+0

Возможно, просто создайте еще один 'AsyncTask', когда все будет готово, загрузив следующий файл в ваш большой список. –

+0

Я бы попытался найти решение, которое сочетает в себе преимущества как последовательного, так и параллельного выполнения загрузок. Это, вероятно, означает написание простого «менеджера», который управляет очередью с загружаемыми файлами и активными задачами загрузки. Если вы ограничиваете количество параллельных загрузок, например, 4 (только случайно выбранный номер - вы можете попытаться оптимизировать это эмпирически или даже на устройство на основе его параметров), вы, вероятно, получите наилучшие результаты с точки зрения соотношения производительности/памяти. –

ответ

1

Там нет причин, чтобы использовать многочисленные AsyncTask с, так как вы можете создать список имен файлов, передать его в одном AsyncTask, и после того, как каждый файл будет загружен, опубликовать ход загрузки с publishProgress() и onProgressUpdate(), который запускается в UI и может легко уведомлять о других действиях в вашем приложении.

private class DownloadFilesTask extends AsyncTask<URL, String, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     for (int i = 0; i < count; i++) { 
      Downloader.downloadFile(urls[i]); 
      publishProgress(urls[i].toString()); 
     } 
     return 0; 
    } 

    protected void onProgressUpdate(String... progress) { 
     // notify whomever you like with url from progress[0] 
     // this is run on UI thread 
    } 

    protected void onPostExecute(Long result) { 
     // do something else 
     // this is also run on UI thread 
    } 
} 
+0

привет, вы можете здесь пример кода? Пожалуйста. – Hasmukh

0

Удаленная служба будет работать, но я думаю, что это неправильный подход, так как у вас есть только ограниченная функциональность.

Я бы использовал AsyncTask, но вызвал его методом.

Когда вы закончите работу в AsyncTask, снова вызовите метод, который будет создавать новую AsyncTask после удаления элемента в списке или обновления некоторого счетчика.

Помните, что AsyncTask нельзя использовать повторно, поэтому его нужно создавать каждый раз.

0

С точки зрения памяти и сети вам будет лучше использовать только один AsyncTask (или поток Java) и загружать все файлы по одному. Это значительно улучшает оперативность устройства и также потребляет немного памяти. В случае, если вы можете контролировать серверную сторону, я также предлагаю вам заархивировать файлы меньшего размера в один архив (мой проект также загружает большое количество файлов через HTTP), и он показывает значительное улучшение скорости, если файлы объединяются в архивы размером около 2 -4 МБ и загружается. Если вы загружаете только TCP/IP-соединение, не имеет значения, насколько велики файлы, если вы не будете повторно устанавливать соединение каждый раз. Но опять же для HTTP самый большой трафик времени обычно является установлением соединения.

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