Опитвам се да попълня ListView със смес от файлове, съхранени на SDcard И съхранени като активи в APK. Използвайки TraceView
, виждам, че производителността на AssetManager.list()
е лоша в сравнение с File.listFiles()
, въпреки че използвам филтър за имена на файлове за SD картата.
Ето един прост метод, който връща всички png файлове от папка на SDcard:
// 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 ms за извличане на 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 ms, за да извлече само имената на около 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? Наясно съм, че активите са компресирани, но извличам само имената на активите, които смятах, че ще се съхраняват някъде в таблица.