2010-11-17 13 views
6

Soy bastante nuevo en la programación de Android/Java, por lo que algunas de las cosas básicas siguen siendo bastante confusas. Entonces, digamos que mi aplicación obtiene todos los datos (artículos) que requiere de archivos XML externos, los analiza en modelos de datos (clase de artículo) y esos artículos serán utilizados (mostrando en listas o un solo artículo) en toda la aplicación para todo ciclo vital.¿Dónde debo guardar/almacenar en caché los datos necesarios para todo el ciclo de vida de la aplicación?

¿Dónde debería guardarlos? ¿Puedo crear clases singleton con una matriz que contenga todos los artículos que he analizado? ¿O debería guardarlos en la base de datos y luego consultarlos a demanda? (Eso suena como demasiado trabajo, no necesito guardarlos en caché por ahora) ¿Cuál es la mejor práctica aquí?

Respuesta

2

Guárdelos en Application. Esta es una clase base de cualquier aplicación de Android y está activa durante toda la vida útil de la aplicación, mientras que las actividades se eliminan cuando no se muestra o cambia la orientación.

tienes que declarar android:name en su AndroidManifest.xml:

<application android:name=".YourApplication"/> 

Editado:

Esto también es relevante: How do I pass data between Activities/Services within a single application?

+0

¿No sería eso demasiado abarrotado de la clase principal? Especialmente, si conservo más datos (matrices) en él y métodos dedicados a administrar (agregar, cambiar, buscar) esos datos. – sniurkst

+0

Esa es su decisión de diseño. Solo digo que la Aplicación es accesible desde todas las Actividades y es el lugar correcto para almacenar datos compartidos que están vinculados al ciclo de vida de la aplicación, no a un ciclo de vida de la actividad. –

+0

Puede poner datos directamente en la aplicación o puede ponerlos en una clase especializada y tener una referencia dentro de la aplicación. –

1

que depende de lo que es su estilo de programación lol.

puedes hacer como dijiste crear un singleton que leerá tu xml y almacenará todo.

puede crear un hash estático en su clase. De esta manera, cuando creas un nuevo objeto, tendrás acceso a la información estática de esa clase.

puede pasar la información de la clase a la clase como parámetros.

si quiere que le digamos cuál sería el mejor será difícil sin conocer la arquitectura de su programa.

por ejemplo, podría tener un controlador de vista que maneje cualquier cambio y luego es simple almacenar los datos en ese nivel para pasarlo cuando cambie de vista.

puede tener vistas estáticas en las que puede establecer directamente todos los valores a medida que los abre.

que podría haber losely ligado puntos de vista que se llaman entre sí sin ningún tipo de control para manejar el cambio y en ese caso usted puede preferir tener una forma de recoger la información que necesita de un único o un método estático ...

+0

Bueno, idealmente, me gustaría tener una clase que: sería accesible para todas las actividades, almacenaría una matriz de objetos y sería capaz de administrar esa matriz (agregar más objetos, obtener objetos por su posición en la matriz o algún tipo de propiedad) si eso hace que mi pregunta sea más clara. – sniurkst

0

Siempre y cuando se asegure de no tener subprocesos que actúen sobre los datos compartidos, puede crear una clase estática con miembros estáticos. cada actividad podrá acceder a ella. Si utiliza la descarga asincrónica para sus datos, en el onPostExecute de su controlador puede tocar GlobeVars porque eso se ejecuta en el hilo de la interfaz de usuario.

public class GlobalVars { 
    public static String userId = "?"; 
    //public static String serverUrl = "10.0.2.2"; //localhost when developing 
    public static String serverUrl = "192.168.1.4"; //on device to laptop 
    //public static String serverUrl = "102.192.293.10"; //production 
    public static Book currentBook = null; 
    public static Chapter currentChapter = null; 
    public static int lastclickedChapter = -1; 
    public static Voice currentVoice = null; 
    public static String catalogJson = ""; 
    public static ArrayList<Book> catalogItems = null; 
} 

onCreate de MainActivity puedo configurar el catálogo a mi lista descargada de XML convertida a objetos

GlobeVars.catalogItems = downloaded xml to object list 

en mi subactividad que es una lista de capítulos en OnClickListener puedo configurar:

GlobeVars.currentChapter = items[clickeditem]; 

cuando regrese a la actividad principal, los valores seguirán configurándose.

Cuestiones relacionadas