1

J'utilise Glide pour charger des images dans mon application, je l'utilise pour montrer quelques images dans RecyclerView articles.Glide, Recyclerview et OOM

ceci est mon adaptateur pour 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;} 

} 

} 

tout fonctionne bien, sauf Bitmap ou Drawable de ImageViews ne supprimera pas de mémoire lorsque des éléments sont détachés de la fenêtre ou mieux dire , lorsque les éléments ne sont pas visibles

et après le défilement pendant 1 minute, j'obtiens l'exception de mémoire.

comme vous pouvez le voir, je suis en utilisant la méthode Glide.clear() pour ce problème, mais il ne fonctionne pas.

des suggestions sur ce problème?

+0

Êtes-vous par hasard à l'aide d'un '' RecyclerView' dans un ScrollView '? – GVillani82

+0

@ GVillani82 non c'est juste un RecyclerView, btw scrolling imbriqué est désactivé aussi –

+0

Vous avez trouvé une solution à ce problème? –

Répondre

0

Au lieu d'utiliser le contexte qui est passé dans le constructeur de l'appel Glide.with(context) de l'adaptateur, essayez d'utiliser le contexte du ImageView.

Glide recycle et traite les images en fonction du cycle de vie du contexte vous en passant, il est donc toujours préférable de passer dans le contexte « plus petit » possible.

Il avait ressembler à ceci:

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

Merci pour la réponse, mais rien n'a changé. –

0

Essayez d'ajouter dans votre activité ou fragmenter ces deux méthodes:

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

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