我正在开发我的第一个Android应用程序,它是另一个非常受欢迎的应用程序的缓存清理器。我终于获得了检查应用缓存的功能,然后删除它(如果存在)。但是,我设置的用于删除文件的异步任务似乎并未准确更新进度条。由于我是编程n00b,我的代码主要来自其他来源的copypasta。
这是我怀疑有进度条计算问题的块:
@Override
protected Void doInBackground(Void... params) {
// Delete Cache !!
File dir = new File(Environment.getExternalStorageDirectory()
+ "/Android/Data/com.popularapp/Cache");
// Progress Bar
for (int i = 1; i < 100; i++) {
if (isCancelled()) {
break;
} else {
System.out.println(i);
publishProgress(i);
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i2 = 0; i2 < children.length; i2++) {
new File(dir, children[i2]).delete();
}
}
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
tvLoading.setText("Loading... " + values[0] + " %");
tvPer.setText(values[0] + " %");
}
答案 0 :(得分:1)
好像你的嵌套for循环是不必要的,你只需要一个遍历目录。您应该将进度与实际删除文件的for循环的迭代联系起来。
您可以删除外部for循环并使用“i2”计数器变量发布进度。
在你的第二个(现在是第一个)for循环中调用你的publishProgress(i2 / children.length * 100)。这应该是一个更准确的数字,假设所有文件的删除时间大致相同(可能是为了您的目的而适度安全的假设)。
@Override
protected Void doInBackground(Void... params) {
// Delete Cache !!
File dir = new File(Environment.getExternalStorageDirectory()
+ "/Android/Data/com.popularapp/Cache");
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i2 = 0; i2 < children.length; i2++) {
if (isCancelled()) break;
int progress = 100 * i2 / children.length;
Log.w("Deleting files...", "Current iteration: " + i2 + " Progress: " + progress);
publishProgress(progress);
new File(dir, children[i2]).delete();
}
}
return null;
}