Подтвердить что ты не робот

Android Загрузить несколько файлов и показать прогресс в ListView

У меня есть N файлов для загрузки. Я хочу загрузить их последовательно в фоновом режиме - один за другим. Я хочу показать прогресс и статус в ListView. Итак, ListView выглядит так:

Файл1... загружен

File2.... скачано

File3... in progress say 39%

Файл4... Ожидается

....

Listview обновляется периодически (скажем каждые 2 секунды) и файлы большие: 50 МБ или около того. Поэтому они берут 1 минуту плюс для загрузки.

Я передам список URL-адресов файлов в AsyncTask и загрузим их в фоновом режиме. Вопрос в том, как вы продвигаете прогресс в ListView.

Учтите, что пользователь может перейти от страницы ListView, оставив AsyncTask запущенной, чтобы вернуться к просмотру статуса загрузки.

Итак, как ListView "отслеживает" прогресс AsyncTask и отображает его?

Я думаю добавить набор статических переменных AsyncTask (защищая их с помощью блоков "Синхронизированный" ) и использовать периодический UI Updater внутри фрагмента, который отображает ListView. Таким образом, фрагмент будет иметь что-то вроде этого:

Повторить задачу с задержкой по времени?

Есть ли шаблон дизайна, публичный проект или образец кода для этого?

Извините, у меня нет хорошей картины. Ближе всего к тому, что я описываю здесь (похоже, но я планирую использовать AsyncTask и серийную загрузку):

Picture

4b9b3361

Ответ 1

Выполните следующие действия.

  • создать службу с asyncTask в ней для загрузки файла
  • запустить задачу в onStartCommand службы
  • Зарегистрируйте широковещательный приемник в своей деятельности, чтобы получить доступ к сервису
  • onProgressUpdate of AsyncTask отправляет трансляцию в вашу активность
  • отображает прогресс в ListView

Ответ 2

При запуске загрузки вы можете использовать ссылку на индикатор выполнения и обновить его с помощью обработчика.

Asynctask не будет хорошей идеей для вас. Вы должны прочитать этот, прежде чем прыгать глубоко в Asynctask.

Для продолжительной работы фона вы должны заглянуть в Service. [IntentService] является хорошим кандидатом для этого, поскольку его очередь использует для отслеживания нескольких запросов. Boundservice в этом случае хороший вариант.

В качестве альтернативы, если вы хотите больше контролировать пул потоков и при выполнении, вы можете подумать о написании своего собственного загрузчика, используя блокирующую очередь и Executor, где вы сможете контролировать количество потоков и размер очереди