当前位置: 首页 > 知识库问答 >
问题:

Glide、Recyclerview和OOM

邴兴为
2023-03-14

我正在使用Glide在我的应用程序中加载图像,我正在使用它来显示一些图像中的回收人员视图项目。

这是我的适配器回收器视图:

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的Drawable不会从内存中删除。

在滚动1分钟后,我的内存出现异常。

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

关于这个问题的任何建议?

共有2个答案

巫马瀚漠
2023-03-14

尝试使用ImageView的上下文,而不是使用传递到Adapter的构造函数中的Glide.with(上下文)调用。

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

所以它看起来像这样:

Glide.with(holder.getImageView().getContext())
令狐建修
2023-03-14

尝试在您的活动或片段中添加以下两种方法:

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

@Override
public void onLowMemory() {
  super.onLowMemory();
  Glide.with(this).onLowMemory();
}
 类似资料:
  • Glide 是一个 Android 上的图片加载和缓存库,其目的是实现平滑的图片列表滚动效果。 示例代码: // For a simple view:@Overridepublic void onCreate(Bundle savedInstanceState) { ... ImageView imageView = (ImageView) findViewById(R.id.my_i

  • 我正在使用和实现一个刷卡删除。在我的函数中,我调用我的服务来删除带有API请求的元素,但为此我需要适配器给我元素的id。我重写了适配器的函数 但是,当我使用它在我的函数 我在行中遇到一个错误 虽然应该返回一个int:/

  • 我在SwipeRefreshLayout中使用了新的回收视图布局,遇到了一个奇怪的行为。当将列表滚动回顶部时,有时顶部的视图会被打断。 如果我现在尝试滚动到顶部,将触发拉刷新。 如果我尝试删除回收器视图周围的滑动刷新布局,问题就会消失。并且可以在任何手机上复制(不仅仅是L-Preview设备)。 这就是我的布局——行是由RecycleServiceAdapter(此列表中有2种视图类型)动态构建的

  • Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包。 主要特性: 简单管理依赖 支持 versioning packages,包括 Semantic Versioning2.0.0 支持 支持 aliasing packages (e.g. for working with github forks) Remove the need for m

  • Glide Transformations An Android transformation library providing a variety of image transformations for Glide. Please feel free to use this. Are you using Picasso or Fresco? Picasso Transformations F

  • 关于 Glide Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。 Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于Htt