example - patron singleton android
Stleton estático de por vida en Android (4)
No puedes controlar cuándo exactamente los objetos de Java se convierten en basura recolectada. Un objeto se vuelve elegible para la recolección de basura cuando no hay más referencias (no circulares) a él. Con Android, además, no puede controlar cuándo su Actividad se elimina de la memoria.
Se supone que los singletones representan algo que siempre existe.
No puedes obligar a ningún objeto a ser recogido en la basura; puede solicitar que el recolector de basura se ejecute con
System.gc()
pero es solo una solicitud.Si desea que un "singleton" sea elegible para la recolección de basura, probablemente desee tener un método para establecer la variable estática en nulo (y esperar que nada más haya tomado una copia de la referencia). Obviamente, la próxima vez que alguien solicite una instancia, será necesario recrearla. en ese punto no es realmente un singleton, por supuesto.
Tengo una situación poco clara:
¿Se recolectarán las basura de los singletons estáticos después de que se haya destruido la última actividad de retención de referencia? Porque no hay más referencias en la aplicación a instancia singleton. ¿Entonces puedo confiar en singletons?
Por documento oficial de Android :
Normalmente no hay necesidad de subclase de aplicación. En la mayoría de las situaciones, los singletons estáticos pueden proporcionar la misma funcionalidad de una manera más modular.
Por algún post:
Al desarrollar una aplicación, encontré que a veces algunas variables estáticas vinculadas a actividades no estaban inicializadas, ¡aunque se habían inicializado previamente ! Pensé que cuando se inicializa una variable estática permanece así durante toda la vida de la aplicación, pero este no parece ser el caso.
En otras palabras, si nada contiene una referencia a mi clase estática de singleton, ¿qué evitará que se recoja y destruya la basura?
Sí. Cada vez que abandona la aplicación (por ejemplo, la aplicación abre la aplicación de la cámara para tomar una foto o abre el navegador para abrir un enlace, o si el usuario simplemente presiona el botón Atrás), existe la posibilidad de que su objeto de la Application
sea destruido y recreado cuando navegas de nuevo a tu aplicación.
Debe inicializar cualquier variable estática en un bloque static {}
en su clase de Application
personalizada si tiene una, o en sus Activities
para asegurarse de que no serán nulas.
Tenga en cuenta que es más probable que experimente este problema en dispositivos con hardware más débil, menor memoria, pero debe esperar que pueda ocurrir en cualquier dispositivo.
La conclusión es, en Android, no espere que sus variables estáticas permanezcan en la memoria en cualquier momento. Siempre verifique si existen y reinícialos si es necesario en los lugares correctos.
EDITAR:
Sé que ha pasado mucho tiempo, y me olvidé totalmente de este hilo, de todos modos, aquí está la fuente de la documentación oficial del ciclo de vida de Android:
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
Todos los objetos singleton permanecerán incluso si la actividad se destruye.
No, porque si es un singleton, se almacena como un campo static
en su clase, y generalmente los singletons no son destruidos por los clientes, es decir, no pondría un método estático deleteInstance()
que establece la referencia a null
modo que si nadie más lo utiliza, es elegible para la recolección de basura. Para los campos estáticos, la recolección de basura se producirá cuando se descarte el cargador de clases que cargó la clase.
Por este motivo, la palabra clave static
sí puede causar pérdidas de memoria, si hace referencia a objetos de actividad, por lo que debe tener mucho cuidado al usarla.