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]()
Ответы
Ответ 1
Выполните следующие действия.
- создать службу с asyncTask в ней для загрузки файла
- запустить задачу в onStartCommand службы
- Зарегистрируйте широковещательный приемник в своей деятельности, чтобы получить доступ к сервису
- onProgressUpdate of AsyncTask отправляет трансляцию в вашу активность
- отображает прогресс в ListView
Ответ 2
При запуске загрузки вы можете использовать ссылку на индикатор выполнения и обновить его с помощью обработчика.
Asynctask не будет хорошей идеей для вас. Вы должны прочитать этот, прежде чем прыгать глубоко в Asynctask.
Для продолжительной работы фона вы должны заглянуть в Service. [IntentService] является хорошим кандидатом для этого, поскольку его очередь использует для отслеживания нескольких запросов. Boundservice в этом случае хороший вариант.
В качестве альтернативы, если вы хотите больше контролировать пул потоков и при выполнении, вы можете подумать о написании своего собственного загрузчика, используя блокирующую очередь и Executor, где вы сможете контролировать количество потоков и размер очереди