Wann genau ist es auslaufsicher, (anonyme) innere Klassen zu verwenden?

Ich habe einige Artikel über Speicherlecks in Android gelesen und mir dieses interessante Video von Google I / O angesehenzum Thema.

Trotzdem verstehe ich das Konzept nicht vollständig und insbesondere dann nicht, wenn es für den Benutzer sicher oder gefährlich istinnere Klassen innerhalb einer Aktivität.

Das habe ich verstanden:

Ein Speicherverlust tritt auf, wenn eine Instanz einer inneren Klasse länger überlebt als ihre äußere Klasse (eine Aktivität). ->In welchen Situationen kann das passieren?

In diesem Beispiel besteht vermutlich keine Gefahr eines Lecks, da die anonyme Klasse auf keinen Fall erweitert werden kannOnClickListener wird länger leben als die Aktivität, oder?

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

Ist dieses Beispiel gefährlich und warum?

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

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

Ich bezweifle, dass es beim Verständnis dieses Themas darum geht, im Detail zu verstehen, was erhalten bleibt, wenn eine Aktivität zerstört und neu erstellt wird.

Ist es?

Angenommen, ich habe gerade die Ausrichtung des Geräts geändert (was die häufigste Ursache für Undichtigkeiten ist). Wannsuper.onCreate(savedInstanceState) wird in meinem angerufenonCreate(), werden die Werte der Felder wiederhergestellt (wie vor der Änderung der Ausrichtung)? Wird dies auch die Zustände der inneren Klassen wiederherstellen?

Mir ist klar, dass meine Frage nicht sehr präzise ist, aber ich würde jede Erklärung begrüßen, die die Dinge klarer machen könnte.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage