View zur Laufzeit erzeugen

Sentenza

Sentenza

Erfahrenes Mitglied
83
Hi ho
Ich erzeuge testweise Views (die als Button verwendet werden sollen) zur Laufzeit (im Programmcode eines Kontextmenüs):
Code:
            LinearLayout neu = new LinearLayout(this);
            neu.setBackgroundResource(R.drawable.knopf1_green);
            TermineView.addView(neu);
            TextView test = new TextView(this);
            test.setText("TEST");
            neu.addView(test);
            neu.setOnTouchListener(this);
            neu.setClickable(true);
            neu.setOnClickListener(this);
Zum freigeben nutze ich (ebenfalls testweise) den OnClickListener:
Code:
@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        TermineView.removeView(v);
    }
Das klappt auch wunderbar. Nur frage ich mich, als Java-Neuling, ob das Ding damit auch wirklich weg ist. Soweit ich es verstanden habe, werden Objekte in Java automatisch freigegeben sobald es keine Referenz mehr gibt. Mit removeView sollte ja zumindest die Referenz, die in meiner TermineView enthalten war, gelöscht werden - doch gibt es eventuell weitere? Im Context z.B.?

Und kann man das irgendwo überprüfen, welche Objekte noch im Speicher sind, um eventuelle Lecks zu erkennen?
 
Werden aus dem aktuellen Gültigkeitsbereich heraus alle Referenzen durchlaufen, gelten alle Objekte die nicht erreicht werden als "gelöscht". Genau genommen markiert der Garbage-Collector diese Objekte erst und bereinigt sie dann, wenn es am günstigsten ist. Zum Beispiel wenn ein CPU-Kern schläft.

Um Speicherlecks musst du dir bei Java in keinster Weise Gedanken machen. Auch wenn zum Beispiel der Graf zyklisch verläuft. Ist ein Verweis verschwunden, wird das Objekt definitiv bereinigt, die Frage ist nur wann.


View TerminView -> LinearLayout neu -> TextView test

Ist zur Laufzeit das "TerminView"-Objekt die einzigste Möglichkeit um das TextView zu erreichen, wird dieser gelöscht wenn das "TerminView"-Objekt den Verweis auf LinearLayout freigibt.
Genau das machst du durch TermineView.removeView(v). Auch bei "TerminView = null" werden alle enthaltene Objekte gelöscht.

Soweit ich weiß gibt es bei der Android-Programmierung bei dynamisch erzeugten Views ansonsten keine weiteren Referenzen. TermineView ist der einzige Container. Welche Views dort noch im Speicher sind, kann man mit Hilfe von getChildAt() und getChildCount() überprüfen.

Bei kritischen Ressourcen im Allgemeinen muss man bei der automatischen Speicherverwaltung aufpassen. Es ist zum Beispiel ratsam ein Socket per close() zu schließen bevor der Garbage-Collector ihn markiert. Darum muss man sich bei Java selber kümmern.
 
  • Danke
Reaktionen: Sentenza
Auch wenns ein halbes Jahr her ist: danke ^^
 

Ähnliche Themen

M
  • maksimilian
Antworten
3
Aufrufe
1.489
maksimilian
M
A
  • AnimaAngelo85
Antworten
1
Aufrufe
332
swa00
swa00
P
Antworten
0
Aufrufe
553
Pascppal
P
Zurück
Oben Unten