带有进度对话框的Android下载管理器

时间:2017-03-21 03:54:56

标签: android progressdialog android-download-manager

我使用android下载管理器编写了一个Android应用程序,我尝试使用下面的代码显示下载进度。

myTimer.schedule(new TimerTask() {

        public void run() {
            try {
                DownloadManager.Query q;
                q = new DownloadManager.Query();
                q.setFilterById(preferenceManager.getLong(strPref_Download_ID, 0));
                cursorTimer = downloadManager.query(q);
                cursorTimer.moveToFirst();
                int bytes_downloaded = cursorTimer.getInt(cursorTimer.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                bytes_total = cursorTimer.getInt(cursorTimer.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                final int dl_progress = (int) ((double) bytes_downloaded * 100f / (double) bytes_total);
                mProgressDialog.setProgress((int) dl_progress);
            } catch (Exception e) {
            } finally {
            }
        }
    }, 0, 10);

Everthing工作正常,但进度对话框没有显示顺利的pregress,这意味着我希望显示1,2,3,4,5,6,..... 100。

它最初显示为0,然后突然变为12%,然后是31%等100%。 我的文件总大小是26246026字节,在0%时我的下载文件大小是6668字节, 在12%的时候,我下载的文件大小是3197660字节,等等...

2 个答案:

答案 0 :(得分:0)

来自文档,

  

公共无效时间表(TimerTask任务,长时间延迟,长时间段)
  
   为重复的固定延迟执行安排任务   经过一段特定的延迟。

     

参数
  任务 - 要安排的任务。
  delay - 首次执行前的时间量(以毫秒为单位)。
  period - 后续执行之间的时间量(以毫秒为单位)。

在这里,您的代码中有10毫秒的周期。这可能是问题所在。请尝试1毫米。

myTimer.schedule(new TimerTask() {
}, 0, 1);

答案 1 :(得分:0)

首先不要太频繁地查询它可能会挂起您的用户界面并使用ValueAnimator来顺利更改进度。

   myTimer.schedule(new TimerTask() {

        public void run() {
            try {
                DownloadManager.Query q;
                q = new DownloadManager.Query();
                q.setFilterById(preferenceManager.getLong(strPref_Download_ID, 0));
                cursorTimer = downloadManager.query(q);
                cursorTimer.moveToFirst();
                int bytes_downloaded = cursorTimer.getInt(cursorTimer.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                bytes_total = cursorTimer.getInt(cursorTimer.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                final int dl_progress = (int) ((double) bytes_downloaded * 100f / (double) bytes_total);
               changeProgressSmoothly((int) dl_progress);
            } catch (Exception e) {
            } finally {
            }
        }
    }, 0, 5000);



private void changeProgressSmoothly(int progress) {
        ValueAnimator va = ValueAnimator.ofInt(mProgressDialog.getProgress(), progress);

        int mDuration = 2000; //in millis
        va.setDuration(mDuration);
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator animation) {
                mProgressDialog.setProgress((int) animation.getAnimatedValue());
            }
        });
        va.start();

    }