Maison  >  Article  >  Java  >  Quand est-il sûr d'utiliser des classes internes anonymes dans Android ?

Quand est-il sûr d'utiliser des classes internes anonymes dans Android ?

DDD
DDDoriginal
2024-11-09 21:32:02825parcourir

When is it Safe to Use Anonymous Inner Classes in Android?

Quand il est sûr d'utiliser des classes internes anonymes dans Android

Fuites de mémoire de classe interne

Sous Android, une fuite de mémoire se produit lorsqu’une classe interne survit à sa classe externe. Cela peut se produire lorsque la classe interne détient une forte référence à la classe externe, directement ou indirectement via un autre objet.

Situations sûres pour utiliser des classes internes anonymes

Utilisation Les classes internes anonymes à l'intérieur d'une activité sont généralement sûres lorsque :

  • La classe anonyme n'a besoin que d'accéder aux membres finaux ou statiques de l'activité.
  • La classe anonyme est un rappel de courte durée , comme un écouteur de clics.
  • La classe anonyme est utilisée dans la même méthode où elle est définie.
  • La classe externe est une classe interne statique ou une sous-classe d'une classe interne anonyme.

Exemple de classe interne anonyme sécurisée

L'exemple de code que vous avez fourni dans votre question est un exemple de classe interne anonyme sécurisée :

// This is safe because the anonymous class is a short-lived callback
okButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        dialog.dismiss();
    }
});

Situation dangereuse pour utiliser des classes internes anonymes

L'utilisation de classes internes anonymes dans une activité peut être dangereuse lorsque :

  • La classe anonyme détient un référence de longue durée à l'activité ou à son contexte.
  • La classe anonyme remplace les méthodes de la classe externe.
  • La classe anonyme est utilisée à plusieurs endroits dans la classe externe.

Exemple de classe interne anonyme dangereuse

L'exemple de code suivant illustre une classe interne anonyme dangereuse :

// This is dangerous because _droidPlayRunnable holds a long-lived reference to _someFieldOfTheActivity
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);

private Runnable _droidPlayRunnable = new Runnable() { 
    public void run() {
        _someFieldOfTheActivity.performLongCalculation();
    }
};

Comprendre le cycle de vie des activités et les classes internes

Les activités Android ont un cycle de vie qui détermine quand elles sont créées, reprises, mises en pause et détruites. Lorsqu'une activité est détruite, son état interne est perdu. Cela inclut les références à toutes les classes internes de l'activité.

Protection contre les fuites de mémoire

Pour éviter les fuites de mémoire dans les classes internes anonymes, il est important de :

  • Utilisez des classes internes anonymes uniquement lorsque cela est nécessaire.
  • Assurez-vous que les classes internes anonymes libèrent leurs références à la classe externe lorsqu'elles ne sont plus nécessaires.
  • Envisagez plutôt d'utiliser des classes imbriquées statiques de classes internes anonymes lorsque cela est possible.
  • Remplacez la méthode onDestroy() de la classe externe pour libérer toutes les références aux classes internes anonymes.

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