我試圖用SDcard中存儲的文件混合來填充ListView,並將其作爲資產存儲在APK中。使用TraceView
,我可以看到AssetManager.list()
的性能與File.listFiles()
相比較差,儘管我使用SDcard的文件名過濾器。爲什麼AssetManger.list()這麼慢?
下面是一個從文件夾返回的SD卡所有的PNG文件的簡單方法:
// 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;
}
我這裏調用該方法,它需要大約12ms的檢索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方法需要49ms才能檢索到約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中存儲的資產數量成比例?我知道資產是壓縮的,但我只是提取資產的名稱,我認爲這些資產將存儲在某個表中。
你幾乎應該知道什麼在你的資源文件夾 – njzk2
AssetManager很爛,性能很差。我在子文件夾中有大約7.5K文件資源。他們是在資產,因爲他們來自外部來源和維護開銷(重命名文件)等,並將其放入資源的性能打擊是不可接受的。爲了找到這個結構中的文件,我必須遞歸地搜索它,並且性能很糟糕,正如你所說的,主要圍繞.list()。似乎設計師從來沒有想過使用大量靜態數據的應用程序。我會有興趣地看這個。 – Simon