Je suis la construction d'une application de lecteur de musique sur Android et j'ai du mal à charger la liste des chansons sur l'appareil rapidement. Il charge 577 chansons en environ 6,8-7 secondes, ce qui est entièrement trop long. Des conseils?Algorithme de chargement de musique lente
Je suis en train d'obtenir les informations suivantes: chanson
- Nom du morceau
- Artiste
- Nom album
- Song ID
- Que ce soit une sonnerie ou une notification (à l'ignorer)
Son e est mon algorithme actuel:
public static ArrayList<Song> getSongList(Activity activity, String artistBound, Album albumBound) {
long start = System.currentTimeMillis();
ArrayList<Song> songList = new ArrayList<>();
ContentResolver musicResolver = activity.getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if(musicCursor!=null && musicCursor.moveToFirst()){
//get columns
int titleColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.ARTIST);
int albumIdColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM_ID);
int ringColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media.IS_RINGTONE);
int notifColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media.IS_NOTIFICATION);
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
Artist thisArtist = new Artist(musicCursor.getString(artistColumn));
if(artistBound != null && !thisArtist.getName().equals(artistBound)) continue;
long albumId = musicCursor.getLong(albumIdColumn);
Cursor albumCursor = activity.getContentResolver().query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ALBUM},
MediaStore.Audio.Albums._ID + " = ?",
new String[]{Long.toString(albumId)},
null
);
boolean queryResult = albumCursor.moveToFirst();
String albumCover = null;
String albumName = null;
Album album = null;
if (queryResult) {
albumCover = albumCursor.getString(0);
albumName = albumCursor.getString(1);
album = new Album(albumName, albumCover);
}
albumCursor.close();
if(musicCursor.getInt(ringColumn) > 0 || musicCursor.getInt(notifColumn) > 0) {
} else {
if(albumBound == null || albumBound.getName().equals(album.getName())) {
songList.add(new Song(thisId, thisTitle, thisArtist, album));
}
}
}
while (musicCursor.moveToNext());
}
Collections.sort(songList);
Log.d("app", "Got " + songList.size() + " songs in: " + (System.currentTimeMillis() - start) + "ms");
return songList;
}
La question est, je suis en train de charger cette liste au début, comme le premier écran pour le lecteur de musique est la liste des chansons. Mais comme c'est le cas maintenant, l'application se bloque sur cet écran pendant qu'il essaie de charger.
EDIT: Enlever le code qui recherche les informations de l'album le rend incroyablement rapide. Comment puis-je optimiser la recherche d'informations sur l'album?
Mettre en cache le résultat et rechercher uniquement de nouveaux fichiers? –
Peut-être l'exécuter sur une tâche asynchrone, et utiliser publishProgress (Song song), où vous faites songList.add, de cette façon l'interface utilisateur reste réactive et commence instantanément à afficher des chansons – Linxy