Speicherlecks in der Android-Anwendung verstehen

Ich habe den Artikel gefunden "Speicherverluste vermeiden", wo gesagt wird, dass der folgende Code:

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

ist keine gute Idee, da:

Wenn sich die Bildschirmausrichtung ändert, zerstört das System standardmäßig die aktuelle Aktivität und erstellt eine neue, wobei der Status beibehalten wird. Dabei lädt Android die Benutzeroberfläche der Anwendung von den Ressourcen neu.

So der obige Code:

... verliert die erste Aktivität, die bei der ersten Änderung der Bildschirmausrichtung erstellt wurde. Wenn ein Drawable an eine Ansicht angehängt wird, wird die Ansicht als Rückruf für das Drawable festgelegt. Im obigen Code-Snippet bedeutet dies, dass das Drawable einen Verweis auf die TextView enthält, die selbst einen Verweis auf die Aktivität (den Context) enthält, der wiederum auf so ziemlich alles verweist (abhängig von Ihrem Code).

Aber wenn sich die Bildschirmausrichtung ändert, wird die MethodesetBackgroundDrawable (Drawable Hintergrund) heißt, was wiederum aufruft:

background.setCallback(this);

Die MethodeDrawable.setCallback() wird folgendermaßen definiert:

public final void setCallback(Callback cb) {
    mCallback = new WeakReference<Callback>(cb);
}

So sollte jetzt im Hintergrund der alte Verweis auf die vorherige TextView freigegeben und ein neuer Verweis auf die neue TextView erstellt werden.

So scheint es, als würde durch das Ändern der Bildschirmausrichtung nur ein Verweis verloren gehen, bis die Aktivität neu erstellt wird.

Wo gehe ich falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage