341 votes

Quand exactement est-il sûr d'utiliser des classes internes (anonymes)?

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 étendre 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éé.

S'agit-il?

Disons que j'ai juste changé l'orientation de l'appareil (ce qui est la cause la plus fréquente de fuites). Lors de l' 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 l'intérieur des classes?

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X