Ich habe einige Artikel über Speicherlecks in Android gelesen und dieses interessante Video von der Google I/O gesehen zu diesem Thema .
Dennoch verstehe ich das Konzept nicht ganz, und vor allem nicht, wann es für den Benutzer sicher oder gefährlich ist innere Klassen innerhalb einer Aktivität .
Ich habe das so verstanden:
Ein Speicherleck entsteht, wenn eine Instanz einer inneren Klasse länger überlebt als ihre äußere Klasse (eine Aktivität). -> In welchen Situationen kann dies geschehen?
In diesem Beispiel besteht vermutlich keine Gefahr einer undichten Stelle, da es keine Möglichkeit gibt, dass die anonyme Klasse, die OnClickListener
länger leben als die Aktivität, richtig?
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 nun 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 das Verständnis dieses Themas damit zu tun hat, dass man im Detail versteht, was erhalten bleibt, wenn eine Aktivität zerstört und neu erstellt wird.
Ist es das?
Nehmen wir an, ich habe gerade die Ausrichtung des Geräts geändert (was die häufigste Ursache für Undichtigkeiten ist). Wenn super.onCreate(savedInstanceState)
wird in meinem onCreate()
Werden dadurch die Werte der Felder wiederhergestellt (wie sie vor der Ausrichtungsänderung waren)? Werden dadurch auch die Zustände der inneren Klassen wiederhergestellt?
Mir ist klar, dass meine Frage nicht sehr präzise ist, aber ich wäre wirklich dankbar für jede Erklärung, die die Dinge klarer machen könnte.