2017-08-07 8 views
0

別の日、別の質問!私は現在、学校の授業のために音楽プレーヤーを作っています。私のリストビューを作成して作成した1日目から、リストビューは狂ったように遅れていました。数日前、私はLruCacheで画像をキャッシュし始めましたが、パフォーマンスの向上は見られませんでした。今日私はViewHoldersで追加しましたが、パフォーマンスの向上はまったくありません。ViewHolderとキャッシュされた画像を使用したListViewの遅れ

私のリストビューでは、フォルダアイテムまたは曲アイテムのいずれかを表示できます。フォルダアイテムは、(2つのテキストビューの横の)ビュー内にアルバムイメージを取得します。現在、私の描画可能なリソース(サイズ範囲は15KBから55KBまで)から描画されたハードコーディングされたイメージです。曲目には4つのTextViewしかありません。リストに曲目だけがあるとき、遅れは少し少なくなりますが、まだまだです。

現在、ListViewには最大約10個のアイテムがあります。 Underneathは、リストを作成するために使用されるArrayAdapterです。私はAndroidにはとても新しいので、問題に関連していない場合でも、どんなヘルプやヒントも感謝しています。

public class SongAdapter extends ArrayAdapter{ 

    private final LruCache<String, Bitmap> cache; 
    private ArrayList<Integer> myFolderSongCounts; 

    ViewHolderSongs holderSongs; 
    ViewHolderFolders holderFolders; 

    public SongAdapter(Context context, List objects, ArrayList<Integer> folderSongCounts) { 
     super(context, 0, objects); 

     myFolderSongCounts = folderSongCounts; 

     /* 
     * 
     * CACHE EXAMPLE FROM 
     * https://stackoverflow.com/questions/15586977/listview-scroll-lagging-when-images-is-shown 
     * BY USER Lam Do 
     * 
     * */ 

     final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 

     // Use 1/8th of the available memory for this memory cache. 
     final int cacheSize = maxMemory/8; 

     cache = new LruCache<String, Bitmap>(cacheSize) { 
      @Override 
      protected int sizeOf(String key, Bitmap bitmap) { 
       // The cache size will be measured in kilobytes rather than 
       // number of items. 
       return bitmap.getRowBytes()/1024; 
      } 
     }; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     File song = (File) getItem(position); 

     Log.d("SongAdapter Position: ", ""+ position); 

     Listen main = (Listen) getContext().getApplicationContext(); 
     Typeface custom_font = main.getCustom_font(); 

     //if its an mp3 file, show a song list item 
     if(song.getName().substring(song.getName().length()-4,song.getName().length()).equals(".mp3")) { 
      Mp3File mp3file = null; 
      MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
      retriever.setDataSource(song.getPath()); 
      try { 
       if(convertView == null){ 
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.songs_list_item, parent, false); 

        holderSongs = new ViewHolderSongs(); 
        holderSongs.txt_song_album = (TextView) convertView.findViewById(R.id.song_album); 
        holderSongs.txt_song_artist = (TextView) convertView.findViewById(R.id.song_artist); 
        holderSongs.txt_song_duration = (TextView) convertView.findViewById(R.id.song_duration); 
        holderSongs.txt_song_name = (TextView) convertView.findViewById(R.id.song_name); 

        convertView.setTag(holderSongs); 
       } 
       else { 
        holderSongs = (ViewHolderSongs) convertView.getTag(); 
       } 

       mp3file = new Mp3File(song); 

       String album = mp3file.getId3v2Tag().getAlbum(); 
       String artist = mp3file.getId3v2Tag().getAlbumArtist(); 

       int durationInMilliseconds = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); 
       int durationInSeconds = durationInMilliseconds/1000; 
       int durationMinutes = durationInSeconds/60; 
       String durationSeconds = (durationInSeconds%60 > 10) ? "" + durationInSeconds%60 : "0" + durationInSeconds%60; 
       String duration = durationMinutes + ":" + durationSeconds; 

       holderSongs.txt_song_name.setText(song.getName().substring(0, song.getName().length() - 4)); 
       holderSongs.txt_song_album.setText(getValidValue(album, "undefined")); 
       holderSongs.txt_song_artist.setText(getValidValue(artist, "undefined")); 
       holderSongs.txt_song_duration.setText(getValidValue(duration, "0:00")); 

       holderSongs.txt_song_name.setTypeface(custom_font); 
       holderSongs.txt_song_album.setTypeface(custom_font); 
       holderSongs.txt_song_artist.setTypeface(custom_font); 
       holderSongs.txt_song_duration.setTypeface(custom_font); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedTagException e) { 
       e.printStackTrace(); 
      } catch (InvalidDataException e) { 
       e.printStackTrace(); 
      } 
     } 
     //if its a folder, show a folder list item 
     else { 
      if(convertView == null){ 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.folders_list_item, parent, false); 

       holderFolders = new ViewHolderFolders(); 

       holderFolders.amount_of_songs = (TextView)convertView.findViewById(R.id.amount_of_songs); 
       holderFolders.folder_name = (TextView)convertView.findViewById(R.id.folder_name); 
       holderFolders.folder_image = (ImageView)convertView.findViewById(R.id.folder_image); 

       convertView.setTag(holderFolders); 
      } 
      else { 
       holderFolders = (ViewHolderFolders) convertView.getTag(); 
      } 


      int amountOfSongs = myFolderSongCounts.get(position); 

      holderFolders.folder_name.setText(song.getName()); 
      holderFolders.amount_of_songs.setText(amountOfSongs + " songs"); 

      holderFolders.folder_name.setTypeface(custom_font); 
      holderFolders.amount_of_songs.setTypeface(custom_font); 

      if(position == 0){ 

       Bitmap bmp = getBitmapFromMemCache("perfectlychilled"); 
       if (bmp == null) { 
        bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.perfectly_chilled); 
        addBitmapToMemoryCache("perfectlychilled", bmp); 
       } 

       holderFolders.folder_image.setImageBitmap(bmp); 
      } 
      else if(position == 1){ 
       Bitmap bmp = getBitmapFromMemCache("insurgency"); 
       if (bmp == null) { 
        bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.insurgency); 
        addBitmapToMemoryCache("insurgency", bmp); 
       } 

       holderFolders.folder_image.setImageBitmap(bmp); 
      } 
      else { 
       Bitmap bmp = getBitmapFromMemCache("default"); 
       if (bmp == null) { 
        bmp = BitmapFactory.decodeResource(convertView.getResources(), R.drawable.folderdefault); 
        addBitmapToMemoryCache("default", bmp); 
       } 

       holderFolders.folder_image.setImageBitmap(bmp); 
      } 
     } 



     return convertView; 
    } 

    public void addBitmapToMemoryCache(String key, Bitmap bitmap) { 
     if (getBitmapFromMemCache(key) == null) { 
      cache.put(key, bitmap); 
     } 
    } 

    public Bitmap getBitmapFromMemCache(String key) { 
     return cache.get(key); 
    } 

    static class ViewHolderSongs { 
     TextView txt_song_name; 
     TextView txt_song_album; 
     TextView txt_song_artist; 
     TextView txt_song_duration; 
    } 

    static class ViewHolderFolders { 
     TextView folder_name; 
     TextView amount_of_songs; 
     ImageView folder_image; 
    } 
} 

songs_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:orientation="vertical" 
    android:layout_margin="0dp" 
    android:padding="0dp" 
    android:background="@color/backgroundGray" 
    android:gravity="center_vertical" 
    android:layout_height="70dp"> 

     <TextView 
      android:text="TextView" 
      android:layout_width="280dp" 
      android:layout_height="wrap_content" 
      android:paddingLeft="15dp" 
      android:paddingRight="20dp" 
      android:id="@+id/song_name" 
      android:textColor="@color/textBlack" 
      android:maxLines="1" 
      android:layout_marginBottom="8dp" 
      android:ellipsize="end" /> 

     <TextView 
      android:text="3:26" 
      android:layout_width="100dp" 
      android:layout_height="wrap_content" 
      android:textAlignment="textEnd" 
      android:paddingRight="15dp" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:textColor="@color/textBlack" 
      android:layout_toRightOf="@id/song_name" 
      android:id="@+id/song_duration" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/song_artist" 
      android:textColor="@color/textGray" 
      android:width="190dp" 
      android:gravity="bottom" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:layout_below="@id/song_name" 
      android:paddingRight="20dp" 
      android:paddingLeft="15dp" 
      android:text="Sabaton" /> 

     <TextView 
      android:text="Hell is upon us" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/textGray" 
      android:width="190dp" 
      android:id="@+id/song_album" 
      android:paddingRight="15dp" 
      android:textAlignment="textEnd" 
      android:maxLines="1" 
      android:ellipsize="end" 
      android:layout_below="@id/song_name" 
      android:layout_toRightOf="@id/song_artist" 
      /> 

</RelativeLayout> 

folders_list_item.xml:使用するデータ・ソース(のFileDescriptor)を設定

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:orientation="horizontal" 
    android:layout_marginTop="0dp" 
    android:layout_marginBottom="0dp" 
    android:background="@color/backgroundGray" 

    android:padding="0dp" 
    android:layout_height="115dp"> 

    <ImageView 
     android:layout_height="match_parent" 
     android:id="@+id/folder_image" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 
     android:padding="0dp" 
     android:layout_width="115dp" /> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 

     android:padding="0dp" 
     android:layout_marginLeft="30dp"> 

     <TextView 
      android:layout_marginTop="0dp" 
      android:layout_marginBottom="0dp" 
      android:padding="0dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/folder_name" 
      android:layout_weight="50" 
      android:elevation="14dp" 
      android:textIsSelectable="false" 
      android:gravity="bottom" 
      android:paddingBottom="5dp" 
      android:textAppearance="@android:style/TextAppearance.Material.Medium" 
      android:textColor="@color/textBlack"/> 

     <TextView 
      android:layout_marginTop="0dp" 
      android:layout_marginBottom="0dp" 
      android:paddingTop="5dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/amount_of_songs" 
      android:layout_weight="50" 
      android:textColor="@color/textGray"/> 
    </LinearLayout> 

</LinearLayout> 
+0

ネストされたレイアウトはパフォーマンスに悪い(遅れを取るという驚異はありません!)。 RelativeLayoutsを使用する方が良いでしょう。また、画像はTextViewに** compound drawable **として含めることができるので、ImageViewは役に立ちません。 –

+1

さて、私は相対レイアウトをしようとしています。私は複合型のドロアブルについて聞いたこともありませんでした。ありがとうございました! –

+0

song_list_item.xmlを変更して、4つのTextViewを含むRelativeLayoutを使用するようにしましたが、遅れはまだ悪いです... –

答えて

0

ドキュメントhttps://developer.android.com/reference/android/media/MediaMetadataRetriever.html

--setDataSource。ファイル記述子を閉じるのは呼び出し元の責任です。この呼び出しが返されるとすぐにそれを行うのが安全です。このメソッドを、このクラスの残りのメソッドの前に呼び出します。 この方法には時間がかかることがあります。

アダプタの外で曲の情報を取得し、生の情報をアダプタに渡す必要があります。

+0

これを試してみてください! –

+0

パフォーマンスは少し改善されましたが、それは問題の主な原因と思われます... –

+0

アダプタ:: getViewの内部でIOExceptionの試行/捕捉はありません。私はアダプタ内の完全なIO操作の削除の識別子としてそれを言っています。 –

関連する問題