android - 使用 DownloadManager 在进度条中显示下载进度
问题描述
我正在开发一个 android 应用程序,我正在使用该应用程序DownloadManager
从服务器下载文件。
问题
在文件下载过程中,我想通过progress bar
. 文件已成功下载,但我无法显示下载进度。
我用来显示进度的代码
private void startAppDownload() {
...
// code to show download progress
new Thread(new Runnable() {
@Override
public void run() {
boolean isDownloading = true;
int downloadStatus, totalBytesDownloaded, totalBytes;
DownloadManager.Query downloadQuery = new DownloadManager.Query();
downloadQuery.setFilterById(downloadID);
Cursor cursor = downloadManager.query(downloadQuery);
cursor.moveToFirst();
while (isDownloading) {
totalBytesDownloaded = cursor.getInt(
cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
);
totalBytes = cursor.getInt(
cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)
);
downloadStatus = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
if(downloadStatus == DownloadManager.STATUS_SUCCESSFUL) {
isDownloading = false;
}
final int downloadProgress = (int) ((double)totalBytesDownloaded / (double)totalBytes * 100f);
runOnUiThread(new Runnable() {
@Override
public void run() {
downloadProgressBar.setProgress(downloadProgress);
}
});
}
cursor.close();
}
}).start();
}
我记录了totalBytesDownloaded
变量,但它总是zero
并且totalBytes
变量总是-1
。
这会导致downloadProgress
变量始终为zero
,因此progress bar
没有显示任何进展。
问题
我在这里做错了什么?为什么totalBytesDownloaded
变量总是等于zero
并且totalBytes
变量总是-1
?
解决方案
您有一个逻辑错误,您的查询不在更新 UI 的 while 循环中
private void startAppDownload() {
new Thread(new Runnable() {
@Override
public void run() {
boolean isDownloading = true;
int downloadStatus, totalBytesDownloaded, totalBytes;
while (isDownloading) {
DownloadManager.Query downloadQuery = new DownloadManager.Query();
downloadQuery.setFilterById(downloadID);
Cursor cursor = downloadManager.query(downloadQuery);
cursor.moveToFirst();
totalBytesDownloaded = cursor.getInt(
cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
);
totalBytes = cursor.getInt(
cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)
);
downloadStatus = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
if(downloadStatus == DownloadManager.STATUS_SUCCESSFUL) {
isDownloading = false;
break;;
}
final int downloadProgress = (int) ((double)totalBytesDownloaded / (double)totalBytes * 100f);
runOnUiThread(new Runnable() {
@Override
public void run() {
downloadProgressBar.setProgress(downloadProgress);
}
});
}
cursor.close();
}
}).start();
}
推荐阅读
- docker - Docker Setup, cannot clone the repository because container name already taken
- jq - 如何使用 JQ 正确过滤
- css - Vertical text align not working on mobile
- javascript - jQuery callback OR how to pass a function inside another function
- list - Function that returns a list of two elements in Haskell
- javascript - CkEditor react with markdown - ckeditor-duplicated-modules
- css - 将 Tailwind CSS 与 vue-sfc-rollup 一起使用
- jquery - 如何使用 ajax post 方法传递值。值被传递到视图中。但是模板没有通过上下文的值
- java - 是否有任何情况下 SecurityContext 在请求后不会从 ThreadLocal 中清除?
- php - ffmpeg 4.3 多部分修剪问题