我正在尝试在我加载歌曲时抓住每首歌曲的类型。目前我正在使用这个解决方案:
MediaMetadataRetriever mr = new MediaMetadataRetriever();
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(id));
mr.setDataSource(c, trackUri);
String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
它确实有效,但需要花费很长时间。在我的测试手机上只有大约20首歌曲它可以很快地工作,但在我的主手机上有1700多首歌曲需要很长时间。如果我删除该代码并加载它几乎是即时的歌曲,所以我知道它必须是这样。是否有更好/更有效的方式来获得歌曲ID的歌曲类型?
提前感谢您的帮助!
完整的代码段
try {
if (cursor.moveToFirst()) {
int id = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
int title = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int album = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int artist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int duration = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
int albumId = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
int data = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
do {
MediaMetadataRetriever mr = new MediaMetadataRetriever();
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(id));
mr.setDataSource(c, trackUri);
String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
if (genre == null){
genre = "Not Specified";
}
genres.add(genre);
Song item = new Song(cursor.getLong(id), cursor.getString(title),
cursor.getString(artist), cursor.getString(album),
cursor.getLong(duration),
ContentUris.withAppendedId(albumArtUri, cursor.getLong(albumId)),
Uri.parse(cursor.getString(data)), "");
items.add(item);
} while (cursor.moveToNext());
}
} finally {
cursor.close();
}
答案 0 :(得分:1)
你的do-while循环可能是造成瓶颈的原因。您可以尝试实现代码以并行执行循环的迭代,而不是像您一样按顺序迭代。
我不确定游标正在迭代什么类型的数据结构,但假设它是一个名为allCursors的数据结构,代码看起来像这样:
allCursors.parallelStream().forEach(cursor -> {
// inside of loop
});