2012-03-17 12 views
8

En mi aplicación hay una clase en la que he declarado algunas variables static. El problema es que los valores de todas las variables no se restablecen cuando se destruye la aplicación.
¿Hay alguna manera de restablecer los valores de todas las variables estáticas cuando la aplicación se destruye, excepto que los restablece individualmente en onDestroy()?Borrado de datos estáticos onDestroy()

Respuesta

10
class MySettings { 
    // final can't be changed 
    public static final String CONSTANT = "ucantchangeme"; 

    // static - all Objects have just these - even different Acitivities etc 
    public static String sUserName; 

    // class instance members - each Object you create with new has its own version 
    public String mUserName; 

    public MySettings() { 
     mUserName = "uninitialized"; 
    } 

    public static void init() { 
     sUserName = "Peter"; 
    } 

    public static void reset() { 
     sUserName = null; 
    } 
} 

/* Your Activity */ 
class MyActivity extends Actitivy { 
    private MySettings mSettings; 
    private MySettings mOtherSettings; 

    onCreate() { 
     // init those static parts of MySettings 
     MySettings.init(); 

     mSettings = new mSettings(); 
     mSettings.mUserName = "Peter" 
     Log.d("TAG", "Username: " + mSettings.mUserName); 
     // prints Peter 

     // this could also be another Activity 
     mOtherSettings = new MySettings(); 
     Log.d("TAG", "Username: " + mOtherSettings.mUserName); 
     // prints "uninitialized" 

     MySettings.sUserName = "Jim"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     // prints "Jim" 

     mSettings.sUserName = "Joe"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     Log.d("TAG", "Username: " + mSettings.sUserName); 
     Log.d("TAG", "Username: " + mOtherSettings.sUserName); 
     // all print "Joe" now 
    } 

    onDestroy() { 
     // clear MySettings 
     MySettings.reset(); 
    } 
} 

puede restablecer las variables estáticas a null o cualquier valor que desee, pero el uso de variables estáticas para otras cosas, entonces las constantes suele ser una mala idea - es de diseño generalmente mala clase y puede conducir a un comportamiento inesperado como el que ha observado .

El valor de las variables estáticas se mantendrá mientras se carga la clase - que no tiene casi nada que ver con el ciclo de vida de Actividad (onCreate, ..., onDestroy)

La primera vez que accede a una clase de código se cargará y luego no desaparecerá hasta que haya una razón para descargarlo. Durante ese tiempo, todo lo que se encuentre dentro de su aplicación (técnicamente dentro del mismo proceso, generalmente cada .apk lo usa) leerá el mismo valor de esas estadísticas.Y si lo cambias desde diferentes lugares lo cambias por otras partes que no conocen el cambio - por eso es malo :)

La única razón (sé) que Android descargará una clase es que tu la aplicación se elimina por completo de la memoria, ya sea a través de un asesino de tareas o cuando su aplicación ya no está activa y la memoria baja. Eso está completamente fuera de tu control y no debería suceder mientras se usa tu aplicación. Podría suceder si, por ejemplo, recibe una llamada telefónica y su aplicación se reanuda más tarde.

+0

Exactamente lo mismo que estoy haciendo en este momento, pero hay muchas variables estáticas, que deben restablecerse, así que estaba pensando si hay alguna manera mejor o más clara de hacerlo. – noob

+0

Funciona solo si lo haces manualmente como en 'reset()'. Si tiene muchos de ellos, probablemente podría hacerlo con [reflection] (http://java.sun.com/developer/technicalArticles/ALT/Reflection/) en un bucle sobre todos los campos, pero yo no haría eso. – zapl

1

Eso no es posible, su variable estática debe ser clara cuando su actividad se destruyó. Es posible que su variable estática sea declarada en alguna otra actividad y usted destruya otra actividad.

Activity loses almost all the references once get destroyed. 
+0

Las variables se declaran en una clase separada, que no es una actividad. Se inicializan cuando se lanza la primera actividad. Pero cuando termino la aplicación y compruebo los valores, conservan su valor. – noob

+0

por lo que debe borrarlo manualmente. en onDestroy() de actividad staticvariable = ""/null; –

4

En onDestroy() puede establecer nulos valores a los static variables ..

EDIT:

Static variables son creados e inicializados cuando la clase que contiene ellos se carga en la máquina virtual por el cargador de clases. Cuando la clase está descargada o la máquina virtual finalizó, las variables estáticas pasan a "poof". Hay generalmente no hay necesidad de borrarlos.

supongo que si quería que podría eliminarlas en un onTerminate() método (en la aplicación) o un onDestroy() método (una actividad), pero no hay mucho sentido hacerlo, y no hay no hay garantía de que se llame a cualquiera de esos dos métodos.

Si estás por alguna razón paranoico sobre las variables no son aclarado cuando se creó (una grave violación de "contrato" de la máquina virtual), que podría borrar en un método onCreate().

0

Cuando su estrella de actividad verifica su variable. Una vez que la actividad se destruye, todas las variables se inicializan de nuevo. Verifica tu valor de variable. Es imposible una vez que la actividad se destruye, su valor variable es el mismo. Verifique eso cuando su valor de variable cuando se inicializó.

O Variable reinicializada en el método Destruir. Variable estática = "" o Variable estática = nula.

+0

La variable estática no se inicializa por instancia. Se unen a la clase no a la instancia. – Praveen

0

Si restablece sus variables estáticas en Crear, ya no son estáticas y puede utilizar una variable no estática.

De hecho, lo más probable es que sea mejor hacerlo debido a la falta de sincronía entre el comportamiento variable estático especificado y el ciclo de vida de la aplicación de Android.

Cuestiones relacionadas