Я пытаюсь написать простое приложение, которое обновляется. Для этого мне нужна простая функция, которая может загрузить файл и показать текущий прогресс в ProgressDialog
. Я знаю, как это сделать ProgressDialog
, но я не уверен, как отобразить текущий прогресс и как загрузить файл в первую очередь.
java
android
download
android-asynctask
Том Лиз
источник
источник
Ответы:
Есть много способов загрузки файлов. После я опубликую наиболее распространенные способы; Вам решать, какой метод лучше подходит для вашего приложения.
1. Используйте
AsyncTask
и покажите прогресс загрузки в диалоговом окне.Этот метод позволит вам одновременно выполнять некоторые фоновые процессы и обновлять пользовательский интерфейс (в этом случае мы будем обновлять индикатор выполнения).
Импорт:
Это пример кода:
AsyncTask
Будет выглядеть следующим образом :Метод выше (
doInBackground
) всегда выполняется в фоновом потоке. Вы не должны делать никаких задач пользовательского интерфейса там. С другой стороны,onProgressUpdate
иonPreExecute
запустить в потоке пользовательского интерфейса, так что вы можете изменить индикатор выполнения:Для этого вам нужно разрешение WAKE_LOCK.
2. Скачать с сервиса
Большой вопрос здесь: как мне обновить свою активность из службы? , В следующем примере мы собираемся использовать два класса, о которых вы можете не знать:
ResultReceiver
иIntentService
.ResultReceiver
это тот, который позволит нам обновить наш поток из службы;IntentService
это подкласс, изService
которого создается поток для выполнения фоновой работы (вы должны знать, что наService
самом деле он запускается в том же потоке вашего приложения; когда вы расширяетесьService
, вы должны вручную создавать новые потоки для выполнения операций блокирования ЦП).Сервис загрузки может выглядеть так:
Добавьте сервис в свой манифест:
И активность будет выглядеть так:
Вот
ResultReceiver
каково было сыграть:2.1 Использование библиотеки Groundy
Groundy - это библиотека, которая в основном помогает запускать фрагменты кода в фоновом режиме и основана на
ResultReceiver
концепции, показанной выше. Эта библиотека устарела в данный момент. Вот какбудет выглядеть весь код:Деятельность, в которой вы показываете диалог ...
GroundyTask
Реализация используется Groundy , чтобы загрузить файл и показать прогресс:И просто добавьте это в манифест:
Это не может быть проще, я думаю. Просто возьмите последнюю банку с Github, и вы готовы к работе. Имейте в виду, что основная цель Groundy - выполнять вызовы внешнего API REST в фоновом режиме и легко публиковать результаты в пользовательском интерфейсе. Если вы делаете что-то подобное в своем приложении, это может быть очень полезно.
2.2 Используйте https://github.com/koush/ion
3. Используйте
DownloadManager
класс (GingerBread
и только новее)В GingerBread появилась новая функция,
DownloadManager
которая позволяет легко загружать файлы и делегировать тяжелую работу по обработке потоков, потоков и т. Д. Системе.Во-первых, давайте посмотрим на служебный метод:
Название метода объясняет все это. Если вы уверены, что
DownloadManager
доступны, вы можете сделать что-то вроде этого:Ход загрузки будет отображаться в панели уведомлений.
Последние мысли
Первый и второй методы - только вершина айсберга. Есть много вещей, которые вы должны иметь в виду, если вы хотите, чтобы ваше приложение было надежным. Вот краткий список:
INTERNET
иWRITE_EXTERNAL_STORAGE
); Также,ACCESS_NETWORK_STATE
если вы хотите проверить доступность Интернета.Если вам не нужен подробный контроль над процессом загрузки, подумайте об использовании
DownloadManager
(3), поскольку он уже обрабатывает большинство элементов, перечисленных выше.Но также учтите, что ваши потребности могут измениться. Например,
DownloadManager
не кеширует ответ . Он будет слепо загружать один и тот же большой файл несколько раз. Там нет простого способа исправить это после факта. Где, если вы начинаете с базовогоHttpURLConnection
(1, 2), то все, что вам нужно, это добавитьHttpResponseCache
. Таким образом, первоначальные усилия по изучению основных стандартных инструментов могут быть хорошим вложением.источник
close()
использовать потоки (input
иoutput
)finally
вместоtry
, в противном случае, если возникнет какое-либо исключениеclose()
, у вас будут незакрытые потоки.sdcard/
используйтеEnvironment.getExternalStorageDirectory()
вместо этого.Не забудьте добавить разрешения в ваш файл манифеста, если вы собираетесь загружать материалы из Интернета!
источник
Да код выше будет работать. Если вы обновляете свой
progressbar
инonProgressUpdate
изAsynctask
и при нажатии кнопки назад или закончить Вашу деятельностьAsyncTask
теряет свой трек с UI й когда вы вернетесь к вашей деятельности, даже если загрузка выполняется в фоновом режиме , вы увидите Нет обновления на прогрессбар. Итак,OnResume()
попробуйте запустить поток, например,runOnUIThread
с задачей таймера, которая обновляет urprogressbar
с обновлением значений изAsyncTask
текущего фона.Не забудьте уничтожить поток, когда ваша активность не видна.
источник
Я бы порекомендовал вам использовать мой Project Netroid , он основан на Volley . Я добавил некоторые функции, такие как обратный вызов нескольких событий, управление загрузкой файлов. Это может помочь.
источник
SSLSocketFactory
добавление, этоHostnameVerifier
невозможно, и мне нужен такой верификатор. Возник вопрос по этому поводу.Я изменил
AsyncTask
класс для обработки созданияprogressDialog
в том же контексте. Я думаю, что следующий код будет более многоразовым. (он может быть вызван из любого действия, просто передать контекст, целевой файл, диалоговое сообщение)источник
Не забудьте заменить «/ SDCard ...» на новый файл ( «/ шоссе / SDCard / ...») в противном случае вы получите FileNotFoundException
источник
Environment.getExternalStorageDirectory().getAbsolutePath()
для получения пути к SDCard. Также не забудьте проверить, смонтировано ли внешнее хранилище -Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
( Mannaz )Я нашел этот пост очень полезным, он использует loopJ для загрузки файла, он имеет только одну простую функцию, будет полезен для некоторых новых ребят из Android.
источник
Когда я начинал изучать разработку Android, я понял, что
ProgressDialog
это путь. СуществуетsetProgress
метод,ProgressDialog
который можно вызвать для обновления уровня прогресса при загрузке файла.Лучшее, что я видел во многих приложениях, это то, что они настраивают атрибуты этого диалогового окна прогресса, чтобы лучше видеть и чувствовать диалоговое окно прогресса, чем стандартная версия. Хорошо, когда пользователь увлекается анимацией, такой как лягушка, слон или милые кошки / щенки. Любая анимация в диалоге прогресса привлекает пользователей, и им не хочется долго ждать.
источник
Мой личный совет - использовать диалоговое окно « Прогресс» и создавать его перед выполнением или
OnPreExecute()
часто начинать с него , если вы используете горизонтальный стиль индикатора выполнения диалогового окна прогресса. Оставшаяся часть заключается в оптимизации алгоритмаdoInBackground
.источник
Используйте библиотеку запросов Android, это очень круто. Вы можете изменить ее на использование,
ProgressDialog
как вы видите в других примерах. В этом примере будет отображаться прогресс выполнения из макета, а после его будет скрываться.источник
Я добавляю другой ответ для другого решения, которое я использую сейчас, потому что Android Query настолько велик и не поддерживается, чтобы оставаться здоровым. Поэтому я перешел на этот https://github.com/amitshekhariitbhu/Fast-Android-Networking .
источник
права доступа
Использование HttpURLConnection
источник
Вы можете наблюдать за прогрессом менеджера загрузок, используя LiveData и сопрограммы, см. Суть ниже
https://gist.github.com/FhdAlotaibi/678eb1f4fa94475daf74ac491874fc0e
источник
Важный
AsyncTask устарела в Android 11.
Для получения дополнительной информации, пожалуйста, проверьте следующие сообщения
Вероятно, следует перейти к Concorency Framework, как предложено Google
источник
Мы можем использовать сопрограмму и рабочий менеджер для загрузки файлов в kotlin.
Добавить зависимость в build.gradle
Класс WorkManager
Начните загрузку через менеджер работ в классе активности
источник