Показать прогресс загрузки внутри действия с помощью 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); } 

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

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

 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); 
Давайте будем гением компьютера.