Quand est-il exactement de fuite sûr à utiliser (anonyme) intérieur classes?

J'ai lu quelques articles sur les fuites de mémoire dans Android et regardé cette vidéo intéressante de Google I/O sur le sujet.

Encore, je ne comprends pas tout le concept, et surtout quand il est sûr ou dangereux pour l'utilisateur intérieur des classes à l'intérieur d'une Activité.

C'est ce que j'ai compris:

Une fuite de mémoire se produit si une instance d'un intérieur de classe survit plus que de l'extérieur de la classe (une Activité).
-> Dans quelles situations peut-il se passer?

Dans cet exemple, je suppose qu'il n'y a pas de risque de fuite, car il n'existe aucun moyen de la classe anonyme extension OnClickListener vivent plus longtemps que l'activité, à droite?

    final Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.dialog_generic);
    Button okButton = (Button) dialog.findViewById(R.id.dialog_button_ok);
    TextView titleTv = (TextView) dialog.findViewById(R.id.dialog_generic_title);

    //*** Handle button click
    okButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            dialog.dismiss();
        }
    });

    titleTv.setText("dialog title");
    dialog.show();

Maintenant, est-ce un exemple dangereux, et pourquoi?

//We are still inside an Activity
_handlerToDelayDroidMove = new Handler();
_handlerToDelayDroidMove.postDelayed(_droidPlayRunnable, 10000);

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

J'ai un doute sur le fait que la compréhension de ce sujet a à voir avec la compréhension en détail ce qui est maintenu lorsqu'une activité est détruit et recréé.

Est-il?

Disons que j'ai juste changé l'orientation de l'appareil (ce qui est la cause la plus fréquente de fuites). Lorsque super.onCreate(savedInstanceState) sera appelé dans mon onCreate(), cette rétablir les valeurs des champs comme ils l'étaient avant le changement d'orientation)? Est-ce aussi restaurer les états de classes internes?

Je me rends compte que ma question n'est pas très précis, mais j'aimerais vraiment apprécier toute explication qui pourrait rendre les choses plus claires.

  • Ce billet et ce billet quelques bonnes informations sur les fuites de mémoire et les classes internes. 🙂
InformationsquelleAutor Sébastien | 2012-06-02