2016-08-15 6 views
1

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?

+2

Mettre en cache le résultat et rechercher uniquement de nouveaux fichiers? –

+0

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

Répondre

2

L'une des solutions consiste à utiliser une méthode de chargement paresseux. L'idée est que vous ne chargez pas toutes les entrées, mais disons la moitié de l'ensemble de données. Dans votre cas, cela réduira considérablement le temps de chargement. Sur Internet, vous pouvez trouver plusieurs implémentations de chargement paresseux d'aller chercher des images à partir d'un serveur et de les afficher. Vous pouvez le modifier de manière à lire les chansons du stockage local à la place. Vérifiez la réponse acceptée here.