2012-03-30 15 views
4

Ich versuche, einige Ansichten aus dem Speicher zu löschen.Wie löscht man eine dynamisch erstellte Ansicht aus dem Speicher?

Hier ist die Situation. ich eine Aktivität haben, dass ich es A und ein anderes B.

Jetzt drücke ich einen Knopf in Aktivität A, die mit Aktivität B aufruft, die eine Menge von Ansichten dynamisch Danach erzeugt rufen werde, drücke ich Taste, um zurückzukehren Aktivität A Wiederholen Sie diese Schritte oft.

Das Ergebnis ist, in DDMS, die Anzahl der Objekte und Speicher zugeordnete Stills wächst (die Anzahl der Objekte wird um 88 erhöht und von 0,002MB zugeteilt) Das bedeutet, dass die Ansichten nicht aus dem Speicher entfernt werden!

Wie kann ich die Ansichten vollständig aus dem Speicher löschen?

Thx!

Update- Hier können Sie einige neue Informationen

Grundsätzlich auf meiner „realen Welt“ gehen Ich habe nur eine Aktivität, die eine Menge Zeit erstellt wird. Dies geschieht, weil ich mit einem Webservice kommunizieren muss und alle Antworten in dieser neuen Instanz dieser Aktivität erstellt werden.

Ich habe versucht, dieses Problem mit dem Code unten

@Override 
protected void onDestroy() { 
    super.onDestroy();  
    nullViewDrawablesRecursive(mRootView); 
    mRootView = null; 
    System.gc(); 
} 

und das ist mein nullViewDrawablesRecursive

private void nullViewDrawablesRecursive(View view) { 
    if (view != null) { 
     try { 
      ViewGroup viewGroup = (ViewGroup) view; 


      int childCount = viewGroup.getChildCount(); 
      for (int index = 0; index < childCount; index++) { 
       View child = viewGroup.getChildAt(index); 
       nullViewDrawablesRecursive(child); 
      } 
     } catch (Exception e) { 
     } 

     nullViewDrawable(view); 
    } 
} 

zu lösen Und das ist mein nullViewDrawable

private void nullViewDrawable(View view) { 
    try { 
     view.setBackgroundDrawable(null); 
    } catch (Exception e) { 
    } 

    try { 
     ImageView imageView = (ImageView) view; 
     imageView.setImageDrawable(null); 
     imageView.setBackgroundDrawable(null); 
    } catch (Exception e) { 
    } 
} 

Grundsätzlich versuche ich Entfernen Sie alle Ansichten und untergeordneten Elemente von ihrem übergeordneten Element (mRootView), bevor Sie die activi löschen ty. Es funktioniert ziemlich gut, wenn ich das nicht mache, nehmen die Objekte und die Speichernutzung immer mehr zu.

Der Punkt ist, es ist nicht perfekt, anscheinend wird eine Art von Ansichten nicht zerstört. Und ich denke, ich erfinde das Rad neu, es scheint verdammt schwer für eine einfache Sache!

Nochmals vielen Dank für den Versuch, mir zu helfen!

+0

war nicht "mRootView = null;" genug?Oder mussten Sie die Zeichen rekursiv aufheben? – usman

+0

Sie müssen kein Objekt durch try-catch-Block werfen. Alles, was Sie tun müssen, ist, den Typ wie folgt zu überprüfen: if (Objektinstanz der Klasse) {Class class = (Class) object; } –

Antwort

2

Normalerweise müssen Sie sich keine Gedanken über das Löschen von Sichten aus dem Speicher machen. Sie würden die virtuelle Maschine und das Android-Framework bei Bedarf damit umgehen lassen. Sie müssen sich jedoch mit Speicherlecks befassen. Wenn Ihre Aktivitäten Verweise auf Ansichten freigeben/beibehalten und sie nicht als Garbage Collected erfasst werden können, handelt es sich um ein Problem. Sie können hier durch das Lesen darüber beginnen: http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

Es ist schwer etwas präziser zu beraten, ohne dass Sie Code zu sehen, obwohl ...

+0

Hallo! Als ich diese Anwendung gestartet habe, habe ich besonderes Augenmerk auf diese Speicherlecks und die Techniken gelegt, um sie zu vermeiden. Ich denke, das ist nicht der Punkt, aber die Art, wie ich meine Aktivitäten nutzen muss, ist. Bitte, überprüfe meinen Beitrag beim ersten Post und hilf mir! Ich werde es schätzen! – digulino

+0

Sie sollten nichts von dem tun, was Sie gepostet haben. Können Sie den vollständigen Code für Ihre Aktivität freigeben? Meine Vermutung ist, dass es irgendwo ein Speicherleck gibt, und es wäre besser zu versuchen, das zu beheben, anstatt alle Ihre Ansichten aufzulösen. – elevine

+0

Gut. Ich denke, mein Problem ist wirklich schwer zu verfolgen. Diese Funktionen gehören zu meiner abstrakten WActivy (erweitert Aktivität) und alle anderen Aktivitäten leitet es ab. Daher kann oder kann die Aktivität, die ich verwende, um jede Form von Webservice neu zu erstellen, das Problem sein oder nicht. Ich weiß wirklich nicht, was zu tun ist, dass WAktivi nur diese Funktionen hat und eine andere, mir Orientierungshilfe zu helfen (Ich habe 2 Verhaltensweisen für alle meine customviews zu ihnen Größe entsprechend der Bildschirmgröße zu ändern). Ich habe die "Config Changes" vor einigen Monaten auf "orientation" eingestellt, um mir bei einem anderen Problem zu helfen. Denkst du, dass es das Problem sein kann? – digulino

1

In onDestroy() festgelegt, die Ansichten der Garbage Collector auf null und rufen.

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    myView = null; 
    System.gc(); 
} 

Dies kann durch den Aufruf System.gc() der Garbage Collector helfen, aber es ist nicht garantiert, dass der Speicher gelöscht wird. Solange Sie jedoch kein Leck haben, sollte es kein Problem geben.

+2

Während daran nichts falsch ist, ist es wirklich nicht notwendig. – elevine

+0

Ich habe so etwas probiert, bitte überprüfe meine Bearbeitung auf dem ersten Beitrag gibt es einige neue Informationen zu meinem Problem. – digulino

+0

'System.gc();' sollte nicht aufrufen, auch wenn er 'System.gc();' aufruft 'bedeutet nicht, dass' gc' alle Objekte sammelt oder ausführt. es ist völlig abhängig von gc, ob es laufen wird oder nicht –

Verwandte Themen