2010-12-15 5 views
20

ich in meinem ListActivity folgenden Code verwendenAktivität OnDestroy nie aufgerufen?

// a separate class in project 
public class MyActivity extends ListActivity { 
    // some common functions here.. 
} 

public class SelectLocation extends MyListActivity { 

    public void onCreate(Bundle savedInstance) { 
     // here..... 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (adap != null) adap = null; 
     if (list != null) list = null; 
     System.gc(); 
    } 
} 

einer mich führen, warum onDestroy Methode nicht in meinem Code genannt wird?

+5

Die if-Checks sind überflüssig - 'adap = list = null;' –

Antwort

51

onDestroy() wird nur aufgerufen, wenn das System zu wenig Ressourcen (Arbeitsspeicher, CPU-Zeit usw.) hat und eine Entscheidung trifft, Ihre Aktivität/Anwendung zu beenden oder wenn jemand finish() für Ihre Aktivität aufruft.

Also, um Ihren Code() zu testen, können Sie eine Test-Taste, die finish() auf Ihre Aktivität aufrufen.

Lesen Sie mehr here.

Auch ich glaube, Sie müssen nicht all diese Sachen in onDestroy() aufrufen, bis Adap keine kritische Ressource ist. Und selbst in diesem Fall hat Android-System Mechanismen, um sie ordnungsgemäß zu entsorgen.

+0

onDestroy wird nicht nur aufgerufen, wenn das System wenig Ressourcen hat. Es wird auch aufgerufen, wenn eine 'Activity' nicht mehr erreichbar ist. –

+1

Sie wird auch aufgerufen, wenn Sie das Gerät drehen, da sich seine Eigenschaften geändert haben (d. H. Ausrichtung), was sich auf die verwendeten Ressourcen auswirken kann. Dadurch wird die Aktivität zerstört und erstellt. Nach onDestroy() wird onCreate() aufgerufen. –

24

Es kann nicht garantiert werden, dass Ihre Methode onDestroy überhaupt aufgerufen wird.

Der Code, den Sie in Ihrer onDestroy-Methode verwenden, wird überhaupt nicht benötigt. Wenn "destroy" aufgerufen wird, wird Ihre Aktivität vom Stapel entfernt und ist für die Garbage-Collection mit allen Ressourcen, die nur von der Aktivität referenziert werden, frei. Auch System.gc() soll schlechter Stil sein. Auf Android-Systemen weiß das System fast immer, wann es am besten ist, eine Garbage Collection durchzuführen. Die meiste Zeit, in der eine Aktivität die Garbage Collection beendet, wird automatisch ausgelöst. Entfernen Sie einfach die gesamte onDestroy-Methode. Wenn Sie Probleme mit dem Gesamtspeicher Ihrer Anwendung haben, liegt das Problem anderswo.

+5

Seine Art von lustig, aber das Bild hier sagt, dass onDestroy wird immer aufgerufen werden. Wenn Sie den Text lesen, heißt das auch: "Die gesamte Lebensdauer einer Aktivität findet zwischen dem Aufruf von onCreate() und dem Aufruf von onDestroy() statt." http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle – Ted

+1

Ja am Anfang der Dokumentation und des Bildes wird nicht sehr deutlich gezeigt, dass onDestroy möglicherweise nicht aufgerufen wird. Es wird erst später erwähnt, während der nachfragbare Teil der Tabelle unter dem Bild erklärt wird. Wenn Sie nur einen kurzen Blick auf das Bild werfen, können Sie in die Irre geführt werden. – Janusz

+0

Eigentlich kann man einiges vom Text lesen und bekommt den klaren Eindruck, dass onDestroy immer aufgerufen wird. Sehen Sie sich "Tabelle 1" an: [onDestroy] Wird aufgerufen, bevor die Aktivität zerstört wird. Dies ist der letzte Aufruf, den die Aktivität erhalten wird. – Ted

5

In den meisten Telefonen, wenn die Zurück-Taste gedrückt wird, gibt es zwei OnStop() und OnDestroy() -Methoden, aber wenn es nicht Ihr Fall ist, können Sie eine Schaltfläche zum Aufrufen des Finish(); Methode.