我使用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字节,等等...
答案 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();
}