1

Ich verwende Glide, um Bilder in meiner App zu laden, ich verwende es, um einige Bilder in RecyclerView Elemente anzuzeigen.Glide, Recyclerview und OOM

das ist mein Adapter für 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;} 

} 

} 

alles funktioniert gut, außer Bitmap oder Drawable von ImageViews nicht aus Speicher entfernen, wenn Elemente aus dem Fenster oder besser sagen abgelöst werden , wenn Elemente nicht sichtbar sind.

und nach dem Scrollen für wie 1 Minute bekomme ich out of memory Ausnahme.

Wie Sie sehen können, verwende ich Glide.clear() Methode für dieses Problem, aber es funktioniert nicht.

irgendwelche Vorschläge zu diesem Problem?

+0

Sind Sie zufällig einen 'RecyclerView' in einem' Scroll mit '? – GVillani82

+0

@ GVillani82 nein, es ist nur ein RecyclerView, btw verschachtelt Scrollen ist auch deaktiviert –

+0

Sie haben eine Lösung gefunden? –

Antwort

0

Anstatt den Kontext zu verwenden, der in den Konstruktor des Adapters für den Glide.with(context) Aufruf übergeben wird, versuchen Sie, den ImageView-Kontext zu verwenden.

Glide recycelt und verarbeitet Bilder abhängig vom Lebenszyklus des Kontexts, den Sie übergeben. Daher ist es immer am besten, den "kleinsten" Kontext zu übergeben.

Also würde es so aussehen:

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

Vielen Dank für die Antwort, aber nichts geändert. –

0

Versuchen in Ihrer Aktivität oder ein Fragment dieser beiden Methoden hinzuzufügen:

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

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