1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

View zur Laufzeit erzeugen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Sentenza, 30.05.2012.

  1. Sentenza, 30.05.2012 #1
    Sentenza

    Sentenza Threadstarter Erfahrener Benutzer

    Beiträge:
    224
    Erhaltene Danke:
    65
    Registriert seit:
    15.08.2011
    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?
     
  2. Martin Wantke, 07.11.2012 #2
    Martin Wantke

    Martin Wantke Neuer Benutzer

    Beiträge:
    2
    Erhaltene Danke:
    1
    Registriert seit:
    07.11.2012
    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.
     
    Sentenza bedankt sich.
  3. Sentenza, 07.11.2012 #3
    Sentenza

    Sentenza Threadstarter Erfahrener Benutzer

    Beiträge:
    224
    Erhaltene Danke:
    65
    Registriert seit:
    15.08.2011
    Auch wenns ein halbes Jahr her ist: danke ^^
     

Diese Seite empfehlen