2010-12-15 14 views
20

estoy usando en mi siguiente código ListActivityActividad OnDestroy nunca se llamó?

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

me guíe por qué cualquiera onDestroy método no se llama en mi código?

+5

Las comprobaciones if son superfluas: 'adap = list = null;' –

Respuesta

51

onDestroy() se invoca solo cuando el sistema tiene pocos recursos (memoria, tiempo de CPU, etc.) y toma la decisión de matar su actividad/aplicación o cuando alguien llama al finish() en su actividad.

Por lo tanto, para probar su código() puede hacer un botón de prueba, que llamará al finish() en su actividad.

Más información here.

Además, creo que no necesita llamar a todas estas cosas en onDestroy() hasta que la adaptación no sea un recurso crítico. E incluso en ese caso, el sistema androide tiene mecanismos para deshacerse de ellos adecuadamente.

+0

onDestroy no solo se invoca cuando el sistema tiene pocos recursos. También se llama cuando una 'Actividad' ya no es alcanzable –

+1

También se invoca cada vez que gira el dispositivo ya que sus características han cambiado (es decir, la orientación) lo que podría afectar los recursos utilizados, por lo que destruye y crea la Actividad. Después de onDestroy(), se llama a onCreate(). –

24

No hay ninguna garantía de que se llame a su método onDestroy.

El código que está utilizando en su método onDestroy no es necesario en absoluto. Si se llama destroy, su actividad se eliminará de la pila y, de todos modos, es gratuita para la recolección de basura con todos los recursos que la actividad hace referencia únicamente a ella. También se supone que System.gc() es un estilo incorrecto. En Android, el sistema casi siempre sabe cuándo es el mejor momento para hacer una recolección de basura. La mayoría de las veces que una actividad termina la recolección de basura se activa automáticamente. Solo elimine todo el método onDestroy. Si tiene problemas con la memoria general de su aplicación, el problema está en otra parte.

+5

Es bastante gracioso, pero la imagen aquí dice que siempre se llamará a onDestroy. Si lee el texto, también se dice: "Toda la vida de una actividad ocurre entre la llamada a onCreate() y la llamada a onDestroy()." http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle – Ted

+1

Sí, al principio de la documentación y de la imagen no se muestra con mucha claridad que onDestroy no se invoque. Solo se menciona más adelante mientras se explica la parte de la tabla que se encuentra debajo de la imagen. Si solo tiene un vistazo rápido a la imagen, puede ser engañado. – Janusz

+0

En realidad, puede leer un poco del texto y tener la clara impresión de que siempre se llama a onDestroy. Mire la "Tabla 1": [onDestroy] Llamada antes de que se destruya la actividad. Esta es la última llamada que recibirá la actividad. – Ted

5

En la mayoría de los teléfonos cuando se presiona el botón Atrás se llaman dos veces en los métodos Stop() y onDestroy(), pero si no es su caso, puede crear un botón para invocar el final(); método.

Cuestiones relacionadas