Проблема
Во всем приложении мне нужно скачивать файлы.В некоторых случаях мне нужна только односторонняя связь, в основном связь с действием, которое загрузка завершила.В других случаях мне нужно иметь возможность связаться с фоновым процессом, чтобы отменить загрузку, а затем вернуться к действию, как только эта задача будет выполнена (двусторонняя связь).
Требования
Во всех случаях загрузка связана только с одним действием, поэтому служба кажется ненужной, поскольку мне не нужно поддерживать загрузку в фоновом режиме, пока пользователь выполняет другие действия.Пользователь всегда заблокирован во время загрузки.Процесс загрузки должен быть независимым от активности (не специализирован для одного действия ... многократно использоваться).Было бы идеально иметь одно решение, отвечающее всем требованиям.
Варианты использования
Сейчас у меня есть два примера:
- Пользовательотображается
ProgressDialog
во время загрузки файла.Как только файл завершает загрузку, пользователь переходит к следующему действию.Прогресс отображать не нужно. - Пользователю показывается
ProgressBar
во время загрузки большого файла.Для отмены загрузки файла есть кнопка «Отмена».Нажатие кнопки «Отмена» должно сигнализировать фоновому процессу о необходимости прервать загрузку файла, а затем сообщить об этом действию, как только это действие будет выполнено.Прогресс должен быть показан при загрузке файла.
То, что я пробовал
Моя оригинальная реализация была отдельным классом, запущенным в потоке, который передавался в Context
что бы транслировать прогресс.Это позволило осуществлять связь из фонового процесса с Activity, но не наоборот.
Я попытался Service
, но из различных прочитанных статей я определил, что мои потребности не оправдывают Сервис, поскольку пользователю нуженбыть заблокированным во время загрузки.Я никогда раньше не внедрял Сервис, поэтому столкнулся с проблемами связи (возможно, плохая реализация).
Что было бы идеально
Двусторонняя BroadcastReceiver
.Это возможно?Мне нравится возможность зарегистрироваться на BroadcastReceiver, если я хочу получить обратную связь от фонового процесса, или нет, если мне все равно.У меня уже есть метод в классе, который принимает InputStream
и File
и выполняет передачу, так что метод используется повторно везде, где необходимо загрузить файл прямо сейчас.