2011-12-30 11 views
5

Hace unos días descubrí que singleton puede convertirse en antipatrón en Android. Mi singleton (clase con constructor privado e instancia almacenada en el campo estático) se eliminó (la instancia se eliminó a pesar de que otras actividades seguían usando este singleton (a través del método getInstance()) por lo que se tuvo que crear otra instancia) porque Actividad de la cual se invocó por primera vez se eliminó (después de invocar finalizar solo para esta actividad).Ciclo de vida de singleton basado en enum en Android

He leído ya cómo se puede resolver este problema, pero también acabo de leer "Java eficaz". Se dice que "el tipo de enumeración de elemento único es la forma de bast para implementar un singleton".

Así que ahora me pregunto cuál sería el ciclo de vida de singleton creado de esta manera en la aplicación de Android? ¿Sería lo mismo que en el caso de la "implementación singleton estándar" así que después de destruir la actividad desde la cual fue invocada la primera vez será destruida (incluso si se usó también en otras actividades)?

No estoy preguntando acerca de la implementación de singleton android adecuada o el patrón singleton en sí (es patrón o anti-patrón, etc.) pero me gustaría saber cuál es el ciclo de vida de dicho objeto singleton enum y cuándo será destruido.

+0

Singleton es un antipatrón en general. Si realmente necesita algo de algo, simplemente no haga otro. P – cHao

+0

Esto podría necesitar alguna aclaración: Su singleton (es decir, el código que poner en su enumeración) y la referencia de Android desapareció cuando salió su actividad (y también se cerró su aplicación)? Este sería el comportamiento esperado para cualquier singleton? Todo el estado que necesita retener entre reinicios de la aplicación debe estar en almacenamiento permanente como 'SharedPreferences'. OTOH, podría haber entendido mal la pregunta :-D – Jens

+0

@Jens He actualizado mi pregunta. – mmatloka

Respuesta

2

En todos los casos, las clases que utiliza están vinculadas al ClassLoader que las cargó. Esto es cierto en Java en general, no solo en Android. Android aislará las actividades con el uso de ClassLoader s nuevas cada vez; al menos, no promete que no lo hará, y por lo que yo sé.

Cualquier singleton, u otro estado de nivel de clase, está ligada a la Class que está vinculado a la ClassLoader. Esta es la razón por la que su estado "desaparece"; en realidad, su código de llamada está viendo un nuevo Class en un nuevo ClassLoader.

Por lo tanto, su truco enum, o cualquier otra cosa en esta línea, tendría exactamente el mismo comportamiento. Simplemente no puede "persistir" la información de la actividad de esta manera. Puede y debe escribir en una base de datos SQLite. Probablemente puedas guardarlo en el SharedPreferences también.

-2

Mi aplicación Singleton seguro es así:

puedo crear una clase singleton que tiene un atributo de 'didReceiveMemoryWarning' booleano;

public class SingleTon(){ 
    public boolean didReceiveMemoryWarning = true; 
    ... 
    ... 
} 

En la primera pantalla de la aplicación (Es exactamente primera pantalla de inicio) (tengo una pantalla de bienvenida que es visible 3 seg)

SingleTon.getInstance().didReceiveMemoryWarning = false; 

Y en cada método onCreate de actividad(), marque esta booleano datos,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(SingleTon.getInstance().didReceiveMemoryWarning){ 
      { Load your data from local to your SingleTon class, 
      because your app was released by OS}; 
    } 
} 

es mi implementación.

+0

Esto es solo un singleton. Él dice que esto es lo que no funciona. –

0

El objeto de la aplicación es una buena ubicación para almacenar información que debe ser accesible para varias instancias de actividad o servicio. Puede recuperarlo así (donde se trata de una Actividad o Servicio):

aplicación privada de MyApplication;

en onCreate (...) { ... this.app = (MyApplication) this.getApplication(); ... }

Recuerde que debe establecer el nombre también en el manifiesto: Establecer el atributo "nombre" de la etiqueta de "aplicación": El valor es la ruta a la clase en relación con el paquete de la aplicación.

El objeto de la aplicación se crea cuando se inicia la aplicación, se puede inicializar como en una actividad o servicio en su método onCreate().

Una cosa para recordar: el objeto de la aplicación puede sobrevivir al cerrar su "última" actividad. En este caso, puede obtener el mismo objeto de aplicación con el estado de la interacción previa con su aplicación. Si esto es un problema, debe detectar de alguna manera el inicio inicial de su aplicación (por ejemplo, utilizando una actividad especial de iniciador sin interfaz de usuario, que inicializa el objeto de la aplicación y luego inicia un nuevo intento. Por cierto, lo mismo puede pasar con los singleton si no lo han hecho sin embargo, se perdió en la recolección de basura.

Cuestiones relacionadas