【问题标题】:showing download progress in progress bar using DownloadManager使用 DownloadManager 在进度条中显示下载进度
【发布时间】:2019-05-26 11:33:19
【问题描述】:

我正在开发一个 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 变量总是等于zerototalBytes 变量总是-1

【问题讨论】:

    标签: android android-progressbar android-download-manager


    【解决方案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();
    }
    

    【讨论】:

    • 但这会暂停 ui
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多