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
DDDoriginal
2024-11-09 17:43:02950parcourir

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

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

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:
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