2016-08-15 54 views
1

我正在Android上構建音樂播放器應用程序,我無法在設備上快速加載歌曲列表。它在大約6.8-7秒內加載577首歌曲,這太長了。有小費嗎?慢速音樂加載算法

我試圖獲得以下信息: 宋

  • 歌曲名稱
  • 歌曲藝術家
  • 專輯名稱
  • 宋ID
  • 無論是鈴聲或通知(以忽略它)

她e是我目前的算法:

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; 
} 

的問題是,我想在開始時加載這個名單,作爲音樂播放器的第一個畫面是歌曲列表。但就目前而言,應用程序在試圖加載時掛在此屏幕上。

編輯:刪除搜索相冊信息的代碼使其運行得非常快。我怎樣才能優化專輯信息搜索?

+2

緩存結果,只查找新文件? –

+0

也許在一個異步任務上運行它,並使用publishProgress(Song song),在那裏你做songList.add,這樣UI保持響應,並立即開始顯示歌曲 – Linxy

回答

2

其中一個解決方案是使用延遲加載方法。這個想法是,你不加載所有的條目,但讓我們說一半的數據集。在你的情況下,這將大大減少加載時間。在互聯網上,您可以找到從服務器獲取圖像並顯示它們的幾種延遲加載實現。您可以通過編輯方式來讀取本地存儲中的歌曲。檢查接受的答案here