2017-07-02 166 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(); 
}