Jump to content

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 ;)

Edited by firetonton
Link to comment
Share on other 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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...