使用DownloadManager显示下载活动中的进度

我正在尝试重现DownloadManager在我的应用程序中的Notification栏中显示的相同进度,但是我的进度永远不会被发布。 我试图使用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); } 

我的日志工作正常,而我的下载正在运行,说“正在下载!” 什么时候完成“Download complete!”,但是我的进度不一样,为什么呢? 我真的需要一些帮助,其他逻辑来做到这一点真的很感激

你分为两个整数:

 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); 

以获得整体(虽然是地板)百分比的进展。

保罗的答案是正确的,但是如果下载量更大,你将会很快地达到max 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);