【问题标题】:Progress Bar isn't very accurate进度条不是很准确
【发布时间】:2013-08-14 21:51:00
【问题描述】:

我正在开发我的第一个 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] + " %");
    }

【问题讨论】:

  • 当您在 for 循环中将“i”打印到控制台时,每次迭代该数字是否准确?
  • 我必须弄清楚如何检查控制台是否有这种循环输出,但经过进一步检查,它似乎确实正确计算了每次迭代。顺便说一句,我确实按照建议删除了外循环。

标签: android android-asynctask android-progressbar


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

【讨论】:

  • 关于#1:否。变量i 未在嵌套的for循环中使用。只有一个目录被处理了 100 次。
  • ProgressBar accepts a float。我不这么认为。 Link.
  • @vikram 一旦我达到#3,我就明白了。我无法想象通读该目录的具体原因和任意(100)次,但具体次数。
  • @vikram 我会解决的。刚刚意识到我在想别的东西。
  • 是的,我也在想同样的事情。 #1 和 #3 有点矛盾。
猜你喜欢
  • 2014-04-30
  • 2021-05-27
  • 2022-01-25
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2023-03-16
相关资源
最近更新 更多