Почему AssetManger.list () такой медленный?
я пытаюсь заполнить ListView смесью файлов, хранящихся на SD-карте и хранящихся в виде активов в APK. С помощьюTraceView
Я вижу, что производительностьAssetManager.list()
беден по сравнению сFile.listFiles()
, хотя я'используя фильтр имени файла для SD-карты.
Вот простой метод, который возвращает все файлы png из папки на SD-карте:
// 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? Я'Я знаю, что активы сжаты, но яЯ только выбираю имена активов, которые, как я думал, будут где-то храниться в таблице.