0

要件

外部ストレージ上のすべてのフォルダーとファイルをスキャンして、すべての apk ファイルを見つけ、各 apk ファイルについて情報を取得し、進行状況を表示します。

今までのやり方

私の最初の考えは、これは達成するのが簡単なことだということです。しかし、まあ... うまくいったとしても、期待どおりのパフォーマンスは得られません。

AsyncTask を使用してバックグラウンドでスキャンを実行します。これが私のやり方です:

 private ArrayList<String> sdcardAppsPath;

  protected class ScanTask extends AsyncTask<Context, Scanner, ArrayList<Apk>> {
     private ArrayList<Apk> sdcardApps;  
    @Override
        protected ArrayList<App> doInBackground(Context... params) {

            visitAllDirsAndFiles(Environment.getExternalStorageDirectory());
            for (String path : sdcardAppsPath) {
                //get info about apk file and
                publishProgress(values)  //show in some textviews number of files scanned, total files
                sdcardApps.add(currentScannedItemFoundInfo);
            }
          return sdcardApps
    }

    @Override
        protected void onProgressUpdate(Scanner... values) {
            super.onProgressUpdate(values);
           // update some textView texts based on values
       }   
    }

  // Process all files and directories under dir
        public void visitAllDirsAndFiles(File dir) {
            if (dir != null) {
                if (dir.getAbsoluteFile().toString().endsWith(".apk")) {
                    sdcardAppsPath.add(dir.getAbsoluteFile().toString());
                }

                if (dir.isDirectory()) {
                    String[] children = dir.list();
                    if (children != null) {
                        for (int i = 0; i < children.length; i++) {
                            visitAllDirsAndFiles(new File(dir, children[i]));
                        }
                    }
                }
            }
        }

ご覧のとおり、必要なすべてのapkファイルvistitAllDirsAndFilesを取得した後ArrayList<String>、必要なものをそれぞれ確認できます. sdcardAppsPath欠点は、カードに多くのファイルがあり、パスが見つかっている間アプリが進行状況を示さない場合、これを構築するのに多くの時間がかかる可能性があることです.

達成したいこと

doInBackground見つかったファイルごとに何とかして、必要な情報を取得し、進行状況を更新してからスキャンを続行できるようにしたいと考えています。このように動作するようにコードを更新する方法はありますか?

4

1 に答える 1

0

ファイルの検索中に進行状況を更新したい場合は、後でリストを繰り返して呼び出すのではなく、メソッドpublishProgress内で呼び出したいと思います...visitAllDirsAndFiles

于 2012-09-17T19:33:51.407 に答える