IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Gestion image et fuite mémoire


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Jay
    Jay est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2002
    Messages : 124
    Par défaut Gestion image et fuite mémoire
    Bonjour,

    Je développe actuellement une application qui gère l'affichage de plusieurs image provenant du téléphone ou d'internet.

    Mon problème c'est que de temps en temps sans vraiment l'expliquer, l'application "Crash" avec un message du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    	at android.graphics.Bitmap.nativeCreate(Native Method)
    	at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
    Existe-t-il un moyen d'analyser les fuites mémoires ou les ressources non utilisées.

    Merci

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Salut,

    Ton problème vient d'un non recycle sur une bitmap.

    Il faut les recycler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // désalloue ta mémoire
    bitmap.recycle();
    Attention celle présente dans les imageview aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ImageView iv = findViewbyId(R.id.ton imageview);
    BitmapDrawable dw = (BitmapDrawable) iv.getDrawable();
    		if (dw != null) {
    			Bitmap bmpold = dw.getBitmap();
    			if (bmpold != null)
    				bmpold.recycle();
    		}
    Pour voir ta Mémoire,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public static void logHeap(Class clazz) {
        Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/new Double((1048576));
        Double available = new Double(Debug.getNativeHeapSize())/1048576.0);
        Double free = new Double(Debug.getNativeHeapFreeSize())/1048576.0);
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);
     
        Log.d(APP, "debug. =================================");
        Log.d(APP, "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.myapp.android.","") + "]");
        Log.d(APP, "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576)) +"MB free)");
        System.gc();
        System.gc();
     
        // don't need to add the following lines, it's just an app specific handling in my app        
        if (allocated>=(new Double(Runtime.getRuntime().maxMemory())/new Double((1048576))-MEMORY_BUFFER_LIMIT_FOR_RESTART)) {
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }

  3. #3
    Jay
    Jay est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2002
    Messages : 124
    Par défaut
    Merci pour la réponse aussi rapide.

    Je regarde cela et je fais mes tests dans l’après midi.

    Il ne me reste plus que ce point avant de mettre l'application sur le Market ;-)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Salut, j'ai ce souci aussi, je télécharge des photos du net que je stocke sur la carte SD.
    Ensuite j'aimerais les afficher dans une gridView.
    J'ai essayé la technique du recyclage mais cela me donne une nouvelle erreur : java.lang.RuntimeException: Canvas: trying to use a recycled bitmap
    Ce qui semble logique.
    Alors comment faire ?
    De plus, j'ai l'erreur de dépassement de mémoire alors que je ne charge qu'une seul image d'a peine 500 ko !

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Il faut "recycler" une image à partir du moment où elle n'est plus utilisée.

    Pourrais tu nous montrer un peu de code afin d'analyser comment tu charges/utilises/décharges ton image ?

    Merci.

  6. #6
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par défaut
    Citation Envoyé par dawadam Voir le message
    Salut, j'ai ce souci aussi, je télécharge des photos du net que je stocke sur la carte SD.
    Ensuite j'aimerais les afficher dans une gridView.
    J'ai essayé la technique du recyclage mais cela me donne une nouvelle erreur : java.lang.RuntimeException: Canvas: trying to use a recycled bitmap
    Ce qui semble logique.
    Alors comment faire ?
    De plus, j'ai l'erreur de dépassement de mémoire alors que je ne charge qu'une seul image d'a peine 500 ko !
    Est ce que, dans la vrai vie, tu utilises tes objets après les avoir recyclés, ou avant?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Citation Envoyé par MrDuChnok Voir le message
    Il faut "recycler" une image à partir du moment où elle n'est plus utilisée.

    Pourrais tu nous montrer un peu de code afin d'analyser comment tu charges/utilises/décharges ton image ?

    Merci.
    Je viens de tester avec un code très épuré et ça marche...
    Ça bug quant j'utilise un Adapter pour une GridView.
    Je posterais un code plus approprié dès que possible.


    Citation Envoyé par ZouBi Voir le message
    Est ce que, dans la vrai vie, tu utilises tes objets après les avoir recyclés, ou avant?
    Tu vois, c'est pour ça que j'ai mis que ça semblait logique...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion images opencv python par mémoire partagée
    Par Tchef dans le forum Bibliothèques tierces
    Réponses: 0
    Dernier message: 12/08/2009, 15h12
  2. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  3. Réponses: 2
    Dernier message: 27/12/2004, 09h23
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo