0

私は最初の Android アプリに取り組んでいます。これは、別の非常に人気のあるアプリのキャッシュ クリーナーです。アプリのキャッシュをチェックし、存在する場合はそれを削除する機能をようやく手に入れました。ただし、ファイルを削除するために設定した非同期タスクは、進行状況バーを正確に更新していないようです。私はプログラミング初心者なので、コードのほとんどは他のソースからのコピペです。

プログレスバーの計算に問題があると思われるブロックは次のとおりです。

    @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] + " %");
    }
4

1 に答える 1

1

ネストされた for ループは不要で、ディレクトリを通過するのに必要なのは 1 つだけのようです。ファイルを実際に削除する for ループの反復に進行状況を関連付ける必要があります。

外側の for ループを削除し、「i2」カウンター変数を使用して進行状況を公開できます。

2 番目 (現在は最初) の 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;
}
于 2013-08-14T22:00:14.563 に答える