показывая прогресс загрузки в прогресс-баре с помощью DownloadManager - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над приложением для 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?

1 Ответ

0 голосов
/ 28 декабря 2018

У вас логическая ошибка, ваш запрос находится вне цикла 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();
}
...