SDカードに保存されたファイルとAPKにアセットとして保存されたファイルの混合物をListViewに取り込もうとしています。を使用すると、SD カードにファイル名フィルタを使用しているにもかかわらず、のパフォーマンスがに比べて悪いTraceView
ことがわかります。AssetManager.list()
File.listFiles()
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;
}
ここでそのメソッドを呼び出します。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 メソッドでは、約 6 つのファイルの名前だけを取得するのに 49 ミリ秒かかります。
// 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 に保存されているアセットの数に比例しますか? アセットが圧縮されていることは承知していますが、アセットの名前のみを取得しているため、どこかのテーブルに保存されると思います。