Intereting Posts
Android: какой аудиорежим должен быть настроен для отправки приема голоса между устройствами Android Studio – Gradle 1.5 – опция -core-library Как вернуться к последней запущенной деятельности при повторном запуске приложения после нажатия HOME? Как достичь следующей анимации в дизайне материалов Android? Разница между тестом Android Instrumentation и модульным тестированием в Android Studio? Android x86 porting, неспособный заставить его работать Really Prefer Network: выберите мой собственный сетевой провайдер, как только он станет доступен (из кода) Сделайте эмулятор Android по умолчанию быстрее Webview внутри RecyclerView показывает пустой экран иногда только на устройствах Nougat Ant не может найти javac, JAVA_HOME не будет установлен на Ubuntu Изменение текста SearchView и текста подсказки appcompat IncompatibleClassChangeError после обновления до Android Build Tools 25.1.6 GCM / FCM Универсальный графический загрузчик изображений мигает после уведомления о вызове DataSetChanged Проблема с мгновенным запуском на Android Studio 2.2 Проблемы с форматированием таблицы таблиц Android

Показать прогресс загрузки внутри действия с помощью DownloadManager

Я пытаюсь воспроизвести тот же прогресс, который DownloadManager показывает в панели уведомлений внутри моего приложения, но мой прогресс никогда не публикуется. Я пытаюсь обновить его с помощью runOnUiThread (), но по какой-то причине он не обновляется.

Моя загрузка:

String urlDownload = "https://dl.dropbox.com/s/ex4clsfmiu142dy/test.zip?token_hash=AAGD-XcBL8C3flflkmxjbzdr7_2W_i6CZ_3rM5zQpUCYaw&dl=1"; DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlDownload)); request.setDescription("Testando"); request.setTitle("Download"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "teste.zip"); final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); final long downloadId = manager.enqueue(request); final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1); new Thread(new Runnable() { @Override public void run() { boolean downloading = true; while (downloading) { DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(downloadId); Cursor cursor = manager.query(q); cursor.moveToFirst(); int bytes_downloaded = cursor.getInt(cursor .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { downloading = false; } final double dl_progress = (bytes_downloaded / bytes_total) * 100; runOnUiThread(new Runnable() { @Override public void run() { mProgressBar.setProgress((int) dl_progress); } }); Log.d(Constants.MAIN_VIEW_ACTIVITY, statusMessage(cursor)); cursor.close(); } } }).start(); 

Мой метод statusMessage:

 private String statusMessage(Cursor c) { String msg = "???"; switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) { case DownloadManager.STATUS_FAILED: msg = "Download failed!"; break; case DownloadManager.STATUS_PAUSED: msg = "Download paused!"; break; case DownloadManager.STATUS_PENDING: msg = "Download pending!"; break; case DownloadManager.STATUS_RUNNING: msg = "Download in progress!"; break; case DownloadManager.STATUS_SUCCESSFUL: msg = "Download complete!"; break; default: msg = "Download is nowhere in sight"; break; } return (msg); } 

Мой журнал работает отлично, в то время как моя загрузка работает, говорит «Загрузка в процессе!» И когда это будет завершено, «Загрузите полный!», Но то же самое не происходит по моему прогрессу, почему? Мне действительно нужна помощь, другие логики, которые действительно ценятся

Solutions Collecting From Web of "Показать прогресс загрузки внутри действия с помощью DownloadManager"

Вы делите два целых числа:

 final double dl_progress = (bytes_downloaded / bytes_total) * 100; 

Поскольку bytes_downloaded меньше, чем bytes_total , (bytes_downloaded / bytes_total) будет 0, и ваш прогресс всегда будет 0.

Измените свой расчет на

 final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

Для достижения прогресса в целом (хотя и наполовину) процентили.

Ответ Пола правильный, но с большими загрузками вы быстро достигнете максимума int и начнете получать отрицательный ход. Я использовал это для решения проблемы:

 final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

Как сказал Павел, вы делите два целых числа, с результатом всегда <1.

Всегда указывайте свой номер перед делением, который вычисляет и возвращает в точке с плавающей точкой.

Не забывайте обращаться с DivByZero.

 final int dl_progress = (int) ((double)bytes_downloaded / (double)bytes_total * 100f);