Я пытаюсь заполнить 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? Я знаю, что активы сжаты, но я получаю только имена активов, которые, как я думал, будут храниться где-то в таблице.