Sto tentando di popolare un ListView con una combinazione di file archiviati sulla scheda SD e memorizzati come risorse nell'APK. Utilizzando TraceView
, posso vedere che le prestazioni di AssetManager.list()
sono scarse rispetto a File.listFiles()
, anche se sto utilizzando un filtro nome file per la scheda SD.Perché AssetManger.list() è lento?
Ecco un metodo semplice che restituisce tutti i file PNG da una cartella sulla scheda 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 che il metodo qui e ci vogliono circa 12ms per recuperare i 16 file:
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);
...
Mentre il metodo am.list impiega 49 ms per recuperare solo i nomi di circa 6 file!
// 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);
...
Qualcuno può spiegare perché la performance sarebbe così scarsa? Le prestazioni sono proporzionali al numero di risorse memorizzate nell'APK? Sono consapevole che le risorse sono compresse, ma sto solo recuperando i nomi delle risorse, che pensavo sarebbero state archiviate in una tabella da qualche parte.
si suppone più o meno sapere che cosa c'è nella tua cartella di risorsa – njzk2
AssetManager succhia e le prestazioni sono scadenti. Ho circa 7.5K file in risorse in sottocartelle. Sono attivi perché provengono da una fonte esterna e dal sovraccarico di manutenzione (ridenominazione di file) ecc. E il successo delle prestazioni di metterli in risorse non è accettabile. Per trovare i file in questa struttura, devo cercare ricorsivamente e la performance è terribile, come dici tu, principalmente intorno a .list(). Sembra che i progettisti non abbiano mai pensato alle app che utilizzano grandi quantità di dati statici. Lo guarderò con interesse. – Simon