【发布时间】:2014-12-24 09:54:30
【问题描述】:
我编写了一个小程序,列出了一个 android ListView 中的所有音频和视频文件(存在于 SD 卡上)。我在AsyncTask 中使用CursorLoader 来查询MediaStore,然后用结果数据填充我的ListView。该程序运行良好。
我的问题是,每次启动应用程序时,构建媒体列表都需要很长时间。我明白,这是因为密集的数据库查询。但是,我看到一些应用程序(如股票媒体播放器、MX Player 等)仅在第一次扫描所有媒体文件(这可能需要一段时间)。之后,当应用再次启动时,媒体列表几乎是瞬间弹出。我怎样才能做到这一点?这是我的方法:
private void loadAudio() {
Uri uri1 = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection1 = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder1 = MediaStore.Audio.Media.TITLE + " ASC";
ContentResolver cr1 = getBaseContext().getContentResolver();
Cursor cur1 = cr1.query(uri1, null, selection1, null, sortOrder1);
int count1 = 0;
if (cur1 != null) {
count1 = cur1.getCount();
if (count1 > 0) {
while (cur1.moveToNext()) {
String audioPath = cur1.getString(cur1
.getColumnIndex(MediaStore.Audio.Media.DATA));
//File tempfile = new File(audioPath);
long albumId = cur1.getLong(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
String artist = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String album = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
String track = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String data = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
int duration = cur1.getInt(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart");
Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumId);
Bitmap albumartbitmap = null;
try {
albumartbitmap = MediaStore.Images.Media.getBitmap(getBaseContext().getContentResolver(), albumArtUri);
} catch (Exception exception) {
// log error
}
audioList.add(new AudioData(albumId, artist, album, track, data, duration, albumartbitmap, audioPath));
}
}
}
cur1.close();
}
我在我的AsyncTask 的doInBackground 中调用这个方法:
@Override
protected Void doInBackground(Void... params) {
Looper.prepare();
loadVideo(); //Query media-store and build video list. populate mediaList
loadAudio(); //Query media-store and build audio list. populate audioList
return null;
}
任何帮助将不胜感激!提前致谢!
【问题讨论】:
标签: android android-listview android-asynctask android-cursor mediastore