【问题标题】:Glide, Recyclerview and OOMGlide、Recyclerview 和 OOM
【发布时间】:2017-08-08 03:13:49
【问题描述】:

我正在使用 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 中的 BitmapDrawable 不会从 memory 中删除,当项目从窗口或更好的说, 当项目不可见时。

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

如您所见,我正在使用Glide.clear() 方法解决此问题,但它不起作用。

对这个问题有什么建议吗?

【问题讨论】:

  • 您是否偶然在ScrollView 中使用了RecyclerView
  • @GVillani82 不,它只是一个 RecyclerView,顺便说一句,嵌套滚动也被禁用了
  • 你找到解决办法了吗?
  • @Martín 不,我没有:(
  • 你的图片尺寸是多少?

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


【解决方案1】:

尝试在 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();
}

【讨论】:

    【解决方案2】:

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

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

    所以它看起来像这样:

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

    【讨论】:

    • 感谢您的回答,但没有任何改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2015-07-22
    相关资源
    最近更新 更多