Glide,Recyclerview和OOM

时间:2017-07-02 18:40:19

标签: android android-recyclerview out-of-memory android-glide

我使用 Glide 在我的应用中加载图片,我使用它在 RecyclerView 项目中显示一些图片。

这是我对recyclerview的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Holder>{

private Context context;

private ArrayList<DataImages.DataImage> images;

public MyAdapter (Context context, ArrayList<DataImages.DataImage> images){
    this.context = context;
    this.images = images;
}

@Override
public Holder onCreateViewHolder(ViewGroup viewGroup, int type){
    return new VollipsHolder(LayoutInflater.from(context).inflate(R.layout.m_layout, viewGroup));
}

@Override
public void onBindViewHolder(Holder holder, int position){
    DataImages.DataImage dataImage = images.get(position);
    Glide.with(context)
            .load(dataImage.thumb)
            .skipMemoryCache(true)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .placeholder(R.drawable.loading_placeholder)
            .dontAnimate()
            .into(holder.getImageView());
}

@Override
public void onViewRecycled(Holder holder) {
    super.onViewRecycled(holder);
    Glide.clear(holder.getImageView());
}

@Override
public int getItemCount(){return images.size();}

class Holder extends RecyclerView.ViewHolder{

    private ImageView imageView;

    public Holder (View view){
        super(view);

        imageView = (ImageView) view.findViewById(R.id.m_image);
    }

    public ImageView getImageView(){return imageView;}

}

}

一切正常,但当项目从窗口分离时,ImageViews的位图可绘制不会从内存中删除更好的说,当项目不可见时。

滚动1分钟后我得到内存异常

你可以看到我使用Glide.clear()方法解决了这个问题,但它没有用。

有关此问题的任何建议吗?

2 个答案:

答案 0 :(得分:0)

尝试使用ImageView的上下文,而不是使用传递给适配器构造函数的上下文进行Glide.with(context)调用。

Glide根据您传入的上下文的生命周期来回收和处理图像,因此最好尽可能传递“最小”的上下文。

所以它看起来像这样:

Glide.with(holder.getImageView().getContext())

答案 1 :(得分:0)

尝试在Activity或Fragment中添加以下两种方法:

@Override
public void onTrimMemory(int level) {
  super.onTrimMemory(level);
  Glide.with(this).onTrimMemory(level);
}

@Override
public void onLowMemory() {
  super.onLowMemory();
  Glide.with(this).onLowMemory();
}