要求
扫描外部存储上的所有文件夹和文件以查找所有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]));
}
}
}
}
}
正如你在vistitAllDirsAndFiles
之后看到的那样,我得到了一个ArrayList<String>
我需要的所有apk文件,所以我可以检查每个我想要的东西。缺点是,如果卡上有许多文件且应用程序在找到路径时没有显示进度,则可能需要花费大量时间来构建此sdcardAppsPath
。
我想要实现的目标
我希望能够以doInBackground
以某种方式找到每个找到的文件,获取我需要的信息,更新进度然后继续扫描。任何想法如何更新我的代码工作?
答案 0 :(得分:0)
如果您想在搜索文件时更新进度,而不是之后迭代列表然后调用它,我认为您希望在publishProgress
方法中调用visitAllDirsAndFiles
...