2010-08-24 3 views
0

J'ai une application Android qui dans la méthode onCreate(), précharge beaucoup de graphiques.Dans mon application Android, à chaque fois que je lance mon application, elle se bloque avec l'exception OutOfMemory

Lorsque je teste mon application sur mon HTC Aria et la lance, elle fonctionne correctement. Toutefois, si j'appuie sur le bouton Précédent pour quitter mon application, puis redémarrer l'application, elle se bloque avec une erreur OutOfMemoryError: la taille de l'image dépasse le budget de la machine virtuelle. Si je lance ensuite l'application pour la troisième fois (juste après qu'il s'est écrasé), il se lance très bien. Ensuite, si je le ferme et le relance, il se bloque de nouveau avec un manque de mémoire. Il continue pour toujours ce motif qui s'écrase à chaque fois si je continue d'essayer. J'ai vérifié pour voir quelles méthodes de cycle de vie ont été appelées et onStop() et onDestroy() sont tous deux appelés quand je quitte l'application, mais j'ai le sentiment que quelque chose n'est pas encore nettoyé et que par " s'écraser "l'application quand j'essaie de le lancer la deuxième fois, il est en quelque sorte libre de la mémoire.

Des pensées sur ce qui pourrait se passer ou comment y remédier? S'il vous plaît laissez-moi savoir si vous avez besoin de moi pour poster plus d'informations. Merci!

Info:
Mon application est assez simple et n'a que 1 activité qui joue des animations d'image.

Répondre

2

Vérifiez Avoiding memory leaks pour quelques conseils, ainsi que Attacking memory problems.

+0

Je vais enquêter là-dessus. Jusqu'à présent, j'ai annulé toutes les variables membres de mon application. Et j'ai mis tous les rappels Drawable à zéro mais je reçois toujours les mêmes problèmes. Je vais essayer d'utiliser le MAT et voir si je peux obtenir un peu plus d'informations – justinl

+1

Fixe-le! Ce lien attaquant les problèmes de mémoire était une excellente lecture sur la façon d'utiliser correctement l'outil MAT Analyzer. Il s'avère que j'avais quelques vues et j'ai dû mettre la ressource d'arrière-plan à 0 comme ceci: myView.setBackgroundResource (0); Si vous ne le faites pas explicitement, le système conservera cette ressource, même si vous définissez la vue sur null. – justinl

+0

Je voudrais également ajouter que si vous avez défini des dispositions dans votre code, c'est une bonne idée d'appeler myLayout.removeAllViews(), sinon elles peuvent conserver des références à des choses qu'elles ne devraient pas faire après la fermeture de votre application. – justinl

0

Il semble que quelque chose dans le cycle de vie de l'activité ne soit pas tout à fait correct. Etes-vous sûr que vous avez tous les débuts couverts? Vous avez onStop mais avez-vous onDestroy? Vous manquez probablement l'un de ceux dont vous avez besoin. Peut-être que vous tenez inutilement des références de Context?

+0

Merci Aidanc, que dois-je mettre dans onDestroy pour nettoyer correctement la mémoire? En ce moment, je charge une poignée de graphiques dans des objets AnimationDrawable. – justinl

0

Vous pouvez trouver des informations utiles les nombreuses réponses à cette question: Strange out of memory issue while loading an image to a Bitmap object

Aussi, je deuxième poste de blog « Évite Fuites de mémoire ». Surtout si vous pouvez déclencher le même problème avec les changements d'orientation. L'utilisation de ce contexte lors de la création d'objets d'affichage est une manière sournoise de fuir le contexte d'activité. Dans ma propre application, j'ai réussi à fuir toute une série de contextes, et je serais très vite à court de mémoire lors des changements d'orientation.

Questions connexes