2017-06-06 2 views
2

Ich versuche, das Genre jedes Songs zu greifen, während ich die Lieder laden. Zur Zeit verwende ich diese Lösung:Am effizientesten Weg zum Genre des Songs Android

MediaMetadataRetriever mr = new MediaMetadataRetriever(); 
Uri trackUri = ContentUris.withAppendedId(
        android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
        cursor.getLong(id)); 
mr.setDataSource(c, trackUri); 
String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); 

Es funktioniert, dauert aber eine wahnsinnig lange Zeit. Auf meinem Testtelefon mit nur ~ 20 Songs funktioniert es schnell, aber auf meinem Haupttelefon mit 1700 + Songs dauert es sehr lange. Wenn ich diesen Code entferne und nur die Songs lade, ist es fast augenblicklich, also weiß ich, dass es das sein muss. Gibt es eine bessere/effizientere Möglichkeit, das Genre eines Songs mit der Song-ID zu erhalten?

Vielen Dank im Voraus für jede Hilfe!

Voll Code-Schnipsel

try { 
     if (cursor.moveToFirst()) { 
      int id = cursor.getColumnIndex(MediaStore.Audio.Media._ID); 
      int title = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE); 
      int album = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM); 
      int artist = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST); 
      int duration = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION); 
      int albumId = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID); 
      int data = cursor.getColumnIndex(MediaStore.Audio.Media.DATA); 



      do { 

       MediaMetadataRetriever mr = new MediaMetadataRetriever(); 
       Uri trackUri = ContentUris.withAppendedId(
         android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
         cursor.getLong(id)); 
       mr.setDataSource(c, trackUri); 
       String genre = mr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); 

       if (genre == null){ 
        genre = "Not Specified"; 
       } 


       genres.add(genre); 

       Song item = new Song(cursor.getLong(id), cursor.getString(title), 
         cursor.getString(artist), cursor.getString(album), 
         cursor.getLong(duration), 
         ContentUris.withAppendedId(albumArtUri, cursor.getLong(albumId)), 
         Uri.parse(cursor.getString(data)), ""); 

       items.add(item); 
      } while (cursor.moveToNext()); 
     } 
    } finally { 
     cursor.close(); 
    } 
+0

Ist dies innerhalb einer Schleife? Könnten Sie den Code in die gesamte Schleife schreiben? –

+1

Entschuldigung für die späte Antwort, ich habe das vollständige Snippet in meiner ursprünglichen Frage gepostet. Vielen Dank! – Tino

Antwort

0

Ihre do-while-Schleife wahrscheinlich die Ursache für den Engpass ist. Anstatt sequenziell zu durchlaufen, wie Sie sind, könnten Sie versuchen, Code zu implementieren, um die Iterationen der Schleife parallel auszuführen.

Ich bin nicht sicher, welche Art von Datenstruktur der Cursor durch iteriert, aber es ist eine Datenstruktur allCursors genannt vorausgesetzt, würde der Code wie folgt aussehen:

allCursors.parallelStream().forEach(cursor -> { 
    // inside of loop 
}); 
Verwandte Themen