2016-11-11 10 views
1

私は、曲のすべてのアルバムカバーイメージを表示するアプリを開発しています。だから私は、ロードとキャッシュイメージのグライドを使用していますが、OutOfMemoryErrorが発生を避けるために、私はまだそのエラーを取得:Glideとjava.lang.OutOfMemoryError

11-11 11:05:55.866 11120-11120/com.xrobot.andrew.musicalbumsE/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.xrobot.andrew.musicalbums, PID: 11120 java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available 

これはAlbumAdapterで私のgetViewメソッドです:

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

    RelativeLayout albumsLay = (RelativeLayout)songInf.inflate 
      (R.layout.album_layout, parent, false); 
    ImageView coverView = (ImageView)albumsLay.findViewById(R.id.song_cover); 

    //get song using position 
    Song currSong = songs.get(position); 

    if (Drawable.createFromPath(currSong.getCover()) != null) { 
     Drawable img = Drawable.createFromPath(currSong.getCover()); 
     Glide.with(mContext).load("").placeholder(img).override(50,50).into(coverView); 
    } 

    albumsLay.setTag(position); 
    return albumsLay; 
} 
+0

ドロアブルを作成し、それを '.placeholder()'として使うのではなく、 '(imgPath)'を読み込むべきですか? –

+0

@ThomasRoulinどうすればいいですか? – xRobot

答えて

2

は、画像を直接グライドを使用してみてくださいパス:

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

    RelativeLayout albumsLay = (RelativeLayout)songInf.inflate 
      (R.layout.album_layout, parent, false); 
    ImageView coverView = (ImageView)albumsLay.findViewById(R.id.song_cover); 

    //get song using position 
    Song currSong = songs.get(position); 

    // If you are sure currSong.getCover() exists you can remove the if statement 
    if(new File(currSong.getCover().exists)) 
     Glide.with(mContext).load(currSong.getCover()).override(50,50).into(coverView); 


    albumsLay.setTag(position); 
    return albumsLay; 
} 

また、ビューにホルダーを使用することもできます。これは、メモリ使用量を減らすでしょう:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    CoverHolder holder = null; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.album_layout, null); 
     holder = new CoverHolder(); 
     holder.coverView = (ImageView)convertView.findViewById(R.id.song_cover); 
     convertView.setTag(holder); 
    } else { 
     holder = (CoverHolder)convertView.getTag(); 
    } 
    Glide.with(mContext).load(currSong.getCover()).override(50,50).into(holder.coverView); 
    return convertView; 
} 

// The holder 
public static class CoverHolder{ 
    public ImageView coverView; 
} 

まだ、巨大なリストのパフォーマンスが本当に必要な場合。 RecyclerViewhereをご覧ください。

+0

ありがとう、それは魅力のように動作します:) – xRobot

+1

素晴らしい:)私はまた私の答えでいくつかのヒントを追加しました。 –

関連する問題