Maison > Java > javaDidacticiel > Comment puis-je éviter les fuites de mémoire lors de l'utilisation de classes internes dans les activités Android ?

Comment puis-je éviter les fuites de mémoire lors de l'utilisation de classes internes dans les activités Android ?

DDD
Libérer: 2024-11-09 17:43:02
original
963 Les gens l'ont consulté

How Can I Prevent Memory Leaks When Using Inner Classes in Android Activities?

Utiliser les classes internes en toute sécurité dans les activités :

Les classes internes peuvent présenter des risques de fuite de mémoire lorsque leur durée de vie s'étend au-delà de celle de leur classe conteneur (Activity ) sous Android. Cela peut se produire lorsqu'une instance externe fait référence à des instances internes après que la classe externe a été détruite ou recréée.

Exemple 1 (sûr) :

Dans cet exemple, l'instance anonyme La classe interne est définie dans le cadre de la méthode et ne conserve pas de référence à long terme à l'activité. Par conséquent, il est sécurisé contre les fuites :

final Dialog dialog = new Dialog(this);
// ...
dialog.show();
Copier après la connexion

Exemple 2 (dangereux) :

Cet exemple utilise une classe interne anonyme pour un Runnable exécuté avec un gestionnaire. Puisque le Runnable fait référence à un champ de l'activité, il peut survivre à l'activité et maintenir une référence à celle-ci, entraînant une fuite de mémoire :

_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);
// ...
private Runnable _droidPlayRunnable = new Runnable() { 
    public void run() {
        _someFieldOfTheActivity.performLongCalculation();
    }
};
Copier après la connexion

Quand les classes internes peuvent-elles survivre aux classes externes ?

Les classes internes peuvent survivre à leurs classes externes lorsque :

  • La classe interne est référencée par des objets externes ou des composants, gardant indirectement l'instance externe en vie.
  • La classe interne est déclarée en dehors de la classe englobante et fait manuellement référence à la classe englobante.
  • Modifications dans le cycle de vie de l'application (par exemple, rotation de l'écran) détruisez la classe externe tout en laissant la classe interne intacte.

Activité et vue Fuites :

  • Les activités conservent des références de longue durée à toutes leurs vues.
  • Les classes internes au sein des vues ou des activités peuvent maintenir les instances d'activité ou de vue en vie, même après avoir été détruit ou recréé.
  • Éviter ce type de fuite implique de gérer les références avec soin et d'utiliser des classes internes statiques ou des méthodes d'usine à chaque fois possible.

Fuites exécutables :

  • Les classes exécutables peuvent être implémentées à l'aide de classes internes anonymes, qui peuvent faire référence à des instances d'activité ou de vue.
  • Pour atténuer ce risque, envisagez plutôt d'utiliser des Runnables statiques ou AsyncTask, qui sont gérés par la VM par par défaut.

Bonnes pratiques :

  • Évitez de stocker des références à des instances d'activité ou de vue dans des objets à longue durée de vie.
  • Utilisez classes internes statiques ou méthodes d'usine pour créer des classes internes qui ont besoin d'accéder aux membres de la classe englobante.
  • Évitez les classes internes anonymes pour Exécutables qui font référence à des instances d'activité ou de vue.
  • Utilisez le contexte d'application au lieu du contexte d'activité pour les références qui doivent survivre à la durée de vie de l'activité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal