我正在尝试使用存储在 SD 卡上并作为资产存储在 APK 中的混合文件填充 ListView。使用TraceView
,我可以看到与AssetManager.list()
相比,性能很差File.listFiles()
,即使我正在为 SD 卡使用文件名过滤器。
这是一个简单的方法,它从 SD 卡上的一个文件夹中返回所有 png 文件:
// The folder on SDcard may contain files other than png, so filter them out
private File[] getMatchingFiles(File path) {
File[] flFiles = path.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
name = name.toLowerCase();
return name.endsWith(".png");
}
});
return flFiles;
}
我在这里调用该方法,检索 16 个文件大约需要 12 毫秒:
final String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)||Environment.MEDIA_SHARED.equals(state)) {
File path = Environment.getExternalStoragePublicDirectory(getResources().getString(R.string.path_dir));
if (path.exists()){
File[] files = getMatchingFiles(path);
...
而 am.list 方法只需要 49 毫秒来检索大约 6 个文件的名称!
// Get all filenames from specific Asset Folder and store them in String array
AssetManager am = getAssets();
String path = getResources().getString(R.string.path_dir);
String[] fileNames = am.list(path);
...
谁能解释为什么性能会这么差?性能是否与 APK 中存储的资产数量成正比?我知道资产是压缩的,但我只获取资产的名称,我认为这些名称会存储在某个地方的表中。