我正在尝试将SD卡和APK中存储的文件混合填充到ListView中。使用
TraceView
,我可以看到与SD卡使用文件名过滤器相比,AssetManager.list()
的性能较差。以下是一个简单的方法,它从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;
}
我在这里调用了该方法,大约需要12毫秒来检索16个文件:
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 中的资产数量成比例?我知道资产被压缩了,但我只是获取资产的名称,我认为这些名称应该存储在某个表中。