2017-07-02 127 views
1

我正在使用Glide在我的应用程序中加载图像,我使用它来显示RecyclerView项目中的图像。Glide,Recyclerview and OOM

这是我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()方法这个问题,但它不工作。

对此问题的任何建议?

+0

你使用'RecyclerView'一个'滚动型内机会'? – GVillani82

+0

@ GVillani82不,它只是一个RecyclerView,btw嵌套滚动也被禁用 –

+0

你找到任何解决方案吗? –

回答

0

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

根据您传递的上下文的生命周期,滑翔回收并处理图像,因此总是最好传递“最小”的上下文。

所以它会是这样的:

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

谢谢你的答案,但没有任何改变。 –

0

尝试在你的活动添加或片段这两种方法:

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

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