Алгоритм медленной загрузки музыки

Я создаю приложение для музыкального проигрывателя на Android, и у меня возникают проблемы с загрузкой списка песен на устройство быстро. Он загружает 577 песен примерно за 6,8-7 секунд, что слишком долго. Какие-нибудь советы?

Я пытаюсь получить следующую информацию: Песня

  • Название песни
  • Исполнитель песни
  • Название альбома
  • Идентификатор песни
  • Будь то мелодия звонка или уведомление (чтобы игнорировать его)

Вот мой текущий алгоритм:

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

Проблема в том, что я пытаюсь загрузить этот список в начале, так как первый экран музыкального проигрывателя — это список песен. Но сейчас приложение зависает на этом экране при попытке загрузиться.

РЕДАКТИРОВАТЬ: удаление кода, который ищет информацию об альбоме, делает его невероятно быстрым. Как я могу оптимизировать поиск информации об альбоме?


person jaytj95    schedule 15.08.2016    source источник
comment
Кэшировать результат и искать только новые файлы?   -  person Gerald Schneider    schedule 15.08.2016
comment
Возможно, запустите его в асинхронной задаче и используйте publishProgress (Song song), где вы делаете songList.add, таким образом, пользовательский интерфейс остается отзывчивым и мгновенно начинает отображать песни.   -  person Linxy    schedule 15.08.2016


Ответы (1)


Одним из решений является использование метода ленивой загрузки. Идея состоит в том, что вы загружаете не все записи, а, скажем, половину набора данных. В вашем случае это значительно сократит время загрузки. В Интернете вы можете найти несколько ленивых реализаций загрузки изображений с сервера и их отображения. Вы можете отредактировать его таким образом, чтобы вместо этого читать песни из локального хранилища. Проверьте принятый ответ здесь.

person Todor Kostov    schedule 15.08.2016