2010-12-15 17 views
20

Używam następujący kod w moim ListActivityActivity OnDestroy nigdy nie dzwonił?

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

ktoś poprowadzi mnie dlaczego onDestroy metoda nie jest wywoływana w moim kodu?

+5

Kontrole if są zbędne - 'adap = list = null;' –

Odpowiedz

51

onDestroy() nazywa się tylko wtedy, gdy system jest mało zasobów (pamięć, czas procesora i tak dalej) i podejmuje decyzję, by zabić swoją aktywność/aplikacji lub gdy ktoś nazywa finish() na swojej działalności.

Aby przetestować swój kod(), możesz wykonać przycisk testowy, który wywoła finish() dla Twojej aktywności.

Czytaj więcej here.

Sądzę, że nie trzeba wywoływać tych wszystkich rzeczy w onDestroy(), dopóki dostosowanie nie jest istotnym zasobem. I nawet w takim przypadku system android ma mechanizmy, które umożliwiają ich prawidłowe wyrzucenie.

+0

onDestroy jest nie tylko wywoływany, gdy system ma mało zasobów. Jest również wywoływana, gdy 'Activity' nie jest już dostępna –

+1

Jest również wywoływana za każdym razem, gdy obracasz urządzeniem, ponieważ zmieniły się jego właściwości (tj. Orientacja), które mogą wpłynąć na używane zasoby, więc niszczy i tworzy działanie. Po onDestroy() wywoływana jest funkcja onCreate(). –

24

Nie ma gwarancji, że Twoja metoda onDestroy zostanie w ogóle wywołana.

Kod używany w metodzie onDestroy nie jest w ogóle potrzebny. Jeśli zostanie wywołana destrukcja, twoja aktywność zostanie usunięta ze stosu, a mimo to będzie dostępna do wyrzucania elementów ze wszystkimi zasobami, do których odwołuje się tylko działanie. Również System.gc() powinien być w złym stylu. W systemie Android prawie zawsze wiadomo, kiedy najlepiej zbierać śmieci. Zazwyczaj działanie kończące się wyrzucaniem śmieci jest uruchamiane automatycznie. Po prostu usuń całą metodę onDestroy. Jeśli masz problemy z ogólną pamięcią aplikacji, problem jest gdzie indziej.

+5

To zabawne, ale obraz tutaj mówi, że onDestroy zawsze będzie wywoływany. Jeśli czytasz ten tekst, to jest również powiedziane: "Cały czas trwania działania dzieje się między wywołaniem onCreate() a wywołaniem onDestroy()." http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle – Ted

+1

Tak, na początku dokumentacji i obrazu nie jest pokazane bardzo wyraźnie, że onDestroy może nie zostać wywołany. Jest to tylko wspomniane później, podczas wyjaśniania, jak można usunąć po części tabeli pod obrazem. Jeśli tylko rzucisz okiem na obraz, możesz zostać wprowadzony w błąd. – Janusz

+0

Właściwie można przeczytać sporo tekstu i uzyskać wyraźne wrażenie, że onDestroy jest zawsze wywoływany. Spójrz na "Tabela 1": [onDestroy] Wywoływany przed zniszczeniem działania. To jest ostatnie połączenie, które otrzyma aktywność. – Ted

5

W większości telefonów po naciśnięciu przycisku Wstecz wywoływane są dwa sposoby onStop() i onDestroy(), ale jeśli nie jest to Twój przypadek, możesz utworzyć przycisk wywołania zakończenia(); metoda.

Powiązane problemy