Aller au contenu

Gestion de mémoire : OutOfMemoryError


Recommended Posts

Hello,

Je suis en train de faire une application android qui nécessite pas mal d'images.

Seulement, je me heurte à un soucis : je n'arrive pas à les gérer correctement.

J'ai pourtant fais un maximum pour cette gestion, à savoir :

  • Chargement des images de manière asynchrone pour ne pas avoir de latence
  • inPurgeable dans la Bitmap factory à true
  • inSample size à 6 pour réduire la taille de l'image rendue
  • appels fréquents à System.gc() pour forcer le garbagecollector passer

Pour ça j'ai notamment utilisé ce code :

package com.yannberthou.android.tasks;
import java.lang.ref.WeakReference;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
public class BitmapWorkerTask extends AsyncTask<Integer, Integer, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int scale = 1;
private int data = 0;
// Scale à 6 la plupart du temps
public BitmapWorkerTask(ImageView imageView, int scale) {
	// Use a WeakReference to ensure the ImageView can be garbage collected
	imageViewReference = new WeakReference<ImageView>(imageView);
	this.scale = scale;
}
// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
	data = params[0];

	BitmapFactory.Options options = new BitmapFactory.Options();

 options.inPurgeable = true; // bitmap can be purged to disk
 options.inSampleSize = scale; // image size divided by 6

 return BitmapFactory.decodeResource( imageViewReference.get().getContext().getResources(),
		   data, // Return the resourceId of the image
		   options);
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
	if (imageViewReference != null && bitmap != null) {
		final ImageView imageView = imageViewReference.get();
		if (imageView != null) {
			imageView.setImageBitmap(bitmap);
		}
	}
	System.out.println("DO GC");
	System.gc(); // Avant ça n'y était pas j'ai mis ça pour des tests ...
	System.out.println("GC DONE");
}
}

Qu'est-ce que je ne ferais pas qui pourrais être fait pour régler cela SVP ?

Merci d'avance ;)

Modifié par firetonton
Lien vers le commentaire
Partager sur d’autres sites

  • 3 weeks later...

Bonjour,

Ce n'est pas parce que ton problème de outofmemory intervient lorsque tu charges l'image que le problème est le chargement de l'image.

Le problème intervient parce que la mémoire devient saturée, tu conserves trop de références mais pas uniquement dans ta classe async mais dans l'ensemble de ton code :)

Passe en mode debug, suis le heap et regarde si tu n'as pas trop d'instanciation d'objet qui ne serait pas libéré correctement (exemple : imageview = null...).

Les OOM ne sont jamais faciles à comprendre mais peuvent être faciles à corriger.

Tiens nous au courant.

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...