firetonton Posté(e) 21 mai 2012 Share Posté(e) 21 mai 2012 (modifié) 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é 21 mai 2012 par firetonton Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
arnouf Posté(e) 6 juin 2012 Share Posté(e) 6 juin 2012 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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.