2016-07-26 8 views
0

Ich habe den folgenden Code Aber es dauert zu viel Zeit zu laden, aufgrund der manchmal App abstürzt. Wie mache ich das im Hintergrundprozess? Ich habe versucht, es mit AsyncTask zu tun, aber ich konnte den folgenden Code nicht einfügen. Beachten Sie, dass die aufgeblähte Ansicht "Ansicht" an diesem Teil des Codes zurückgegeben werden muss.Wie bekomme ich alle Audiodateien im Hintergrund (asynchron)?

View view = inflater.inflate(R.layout.activity_second, container, false); 
      ArrayList<Song> songList = new ArrayList<Song>(); 
      final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      final String[] cursor_cols = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DURATION }; 
      final String where = MediaStore.Audio.Media.IS_MUSIC + "=1"; 
      final Cursor cursor = view.getContext().getContentResolver().query(uri, cursor_cols, where, null, null); 
      while (cursor.moveToNext()) { 
       String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); 
       String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); 
       String track = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); 
       String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
       Long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); 
       int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); 
       Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
       Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId); 
       try { 
        MediaStore.Images.Media.getBitmap(view.getContext().getContentResolver(), albumArtUri); 
       } catch (FileNotFoundException exception) { 
        exception.printStackTrace(); 
        albumArtUri = Uri.parse("Unknown"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       Collections.sort(songList, new Comparator<Song>() { 
        public int compare(Song a, Song b) { 
         return a.getTitle().compareTo(b.getTitle()); 
        } 
       }); 
       songList.add(new Song(albumId, track, artist, album, albumArtUri.toString())); 
       RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
       recyclerView.setHasFixedSize(true); 
       recyclerView.setLayoutManager(new GridLayoutManager(view.getContext(),2)); 
       RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(view.getContext(), songList); 
       recyclerView.setAdapter(recyclerViewAdapter); 
       registerForContextMenu(recyclerView); 

      } 
      return view; 

Antwort

1

Sie setzen immer wieder die RecyclerViewinnerhalb die Schleife nach oben!

Versuchen Sie folgendes:

 View view = inflater.inflate(R.layout.activity_second, container, false); 
     ArrayList<Song> songList = new ArrayList<Song>(); 
     final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     final String[] cursor_cols = { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DURATION }; 
     final String where = MediaStore.Audio.Media.IS_MUSIC + "=1"; 
     final Cursor cursor = view.getContext().getContentResolver().query(uri, cursor_cols, where, null, null); 
     while (cursor.moveToNext()) { 
      String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); 
      String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); 
      String track = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); 
      String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
      Long albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); 
      int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); 
      Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
      Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId); 
      try { 
       MediaStore.Images.Media.getBitmap(view.getContext().getContentResolver(), albumArtUri); 
      } catch (FileNotFoundException exception) { 
       exception.printStackTrace(); 
       albumArtUri = Uri.parse("Unknown"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      Collections.sort(songList, new Comparator<Song>() { 
       public int compare(Song a, Song b) { 
        return a.getTitle().compareTo(b.getTitle()); 
       } 
      }); 
      songList.add(new Song(albumId, track, artist, album, albumArtUri.toString())); 
     } 

     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(new GridLayoutManager(view.getContext(),2)); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(view.getContext(), songList); 
     recyclerView.setAdapter(recyclerViewAdapter); 
     registerForContextMenu(recyclerView); 

     return view; 

Wenn das immer noch zu langsam ist, dann ist es wahrscheinlich, dass die Bitmap-Abruf der Schuldige ist. Ich kann dir zeigen, wie man eine AsyncTask nur auf diesen Teil legt.

+0

Es hat nicht geholfen, aber ich habe diese Verbesserung definitiv gemacht. Es gibt einen bestimmten Punkt, an dem ich herausgefunden habe, wo es abstürzt. Eigentlich habe ich diesen Code in onCreateView eines Fragments geschrieben. Ich benutze Tabs, wenn ich die Tabs ändere und zurückkehre, hängt die App und stürzt ab. –

Verwandte Themen