Estoy intentando llenar un ListView con una mezcla de archivos almacenados en la tarjeta SD Y almacenado como activo en el APK. Usando TraceView
, puedo ver que el rendimiento de AssetManager.list()
es pobre en comparación con File.listFiles()
, aunque estoy usando un filtro de nombre de archivo para la tarjeta SD.¿Por qué AssetManger.list() es tan lento?
Aquí es un método simple que devuelve todos los archivos PNG de una carpeta en la tarjeta 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;
}
invoco ese método aquí y se tarda unos 12 ms para recuperar 16 archivos:
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);
...
Considerando que el método am.list toma 49ms para recuperar solo los nombres de aproximadamente 6 archivos!
// 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);
...
¿Alguien puede explicar por qué el rendimiento sería tan pobre? ¿El rendimiento es proporcional a la cantidad de activos almacenados en el APK? Soy consciente de que los activos están comprimidos, pero solo estoy obteniendo los nombres de los activos, que pensé que se almacenarían en una tabla en alguna parte.
que se supone más o menos saber lo que está en su carpeta de recursos – njzk2
AssetManager chupa y el rendimiento es pobre. Tengo aproximadamente 7.5K archivos en activos en subcarpetas. Están en activos porque provienen de una fuente externa y la sobrecarga de mantenimiento (cambio de nombre de los archivos), etc. y el rendimiento alcanzado al ponerlos en los recursos no es aceptable. Para encontrar archivos en esta estructura, tengo que buscar recursivamente y el rendimiento es horrible, como dices, principalmente alrededor de .list(). Parece que los diseñadores nunca pensaron en aplicaciones que usan grandes cantidades de datos estáticos. Lo veré con interés. – Simon