Ich wurde nach gerade diesen Artikel auf, wie Speicherlecks zu vermeiden: android developer blog das Code-Snippet verwendet Es folgt:Warum verliert Android aufgrund statischer Drawable Speicher, wenn der Rückruf zurückgesetzt wird?
private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
Es wird gesagt, dass die ziehbar einen Rückruf Bezug auf Textview hat (und indirekt auf die Aktivität) ; was bei Rotation erhalten bleibt - und daher Speicherleck.
Meine Anfrage ist, dass nicht die Rückruf der ziehbar auf Rotation zurückgesetzt werden - es hält, die neuen Textview bekommen würde (die den neuen Kontext halten wird) .. also die vorherigen Instanzen von Textview/Kontext erlaubt zu sein GC'ed.
EDIT: Die Antworten, die ich bekomme, sind auf, wie man das Problem "löst" - ich suche nicht dafür! Bitte lesen Sie die Abfrage erneut. Ich füge mehr Details hinzu. Wenn Aktivität gestartet wird, die Referenzen sind:
Drawable1 -> TextView1 -> Activity1
Wenn gedreht wird, Activity1 und TextView1 werden zerstört, aber nicht Drawable1
Drawable1 -> TextView2 -> Aktivität2
Dies bedeutet Aktivität1 a nd TextView1 sind frei zu GC'ed - wie kein anderes Objekt einen Verweis auf sie hat. Also, was ist undicht?
Bin ich falsch in diesem Verständnis? Oder kann das Drawable mehrere Ansichten als Callbacks haben? (Mit Blick auf den Quellcode sehe ich keine Liste von Rückrufen auf Drawable).
Wenn Sie Ihr Layout bei der Rotation nicht ändern, ist es eine gute Sache, die Rotation anders zu behandeln: ohne Neubildung der Aktivität (es ist möglich). Das wird deine Probleme lösen. Eine andere Sache mit Speicherlecks ist, dass es sich lohnt, den Hintergrund in 'onDestroy' zu entfernen. –
Danke, aber ich bin besorgt, warum das Leck im ersten Fall passiert. Ich verstehe, wie man das Problem löst. – SlowAndSteady
Eine Rotationsaktivität wird "neu erstellt", sodass Ihre vorherige Ansicht/Ihr Bild mit dem vorherigen Aktivitätskontext verbunden ist - Sie haben also ein Speicherleck. Wenn Sie in onDestroy aufräumen() wird es das Problem beheben –