要件
外部ストレージ上のすべてのフォルダーとファイルをスキャンして、すべての 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
見つかったファイルごとに何とかして、必要な情報を取得し、進行状況を更新してからスキャンを続行できるようにしたいと考えています。このように動作するようにコードを更新する方法はありますか?