2011-08-19 19 views
5

Tengo una aplicación de Android simple que usa una instancia de una clase, llamémoslo DataManager, para administrar el acceso a las clases de dominio de forma similar a Façade. Inicialmente lo diseñé como un singleton que se podía recuperar usando métodos estáticos pero finalmente me irrité con el desorden de mi implementación y refactoré a lo que consideré una idea más simple y más limpia.¿Es posible, y cuál es la mejor estrategia, pasar objetos por referencia de una actividad a la siguiente?

Ahora la idea es que para cada archivo que se abre, se crea un DataManager, que maneja tanto la E/S de archivos como la modificación de las clases de dominio (por ejemplo, Book). Al iniciar una nueva actividad, paso esta instancia como Serializable extra (todavía no llegué a usar Parcelable, pero espero que lo haga cuando tenga el concepto básico en funcionamiento), y luego tomo el DataManager del Intent en el método onCreate() de la nueva Actividad.

Sin embargo, la comparación de los objetos indica que el objeto enviado desde una actividad no es idéntico (referencias diferentes) al objeto recuperado del Bundle en la segunda Actividad. Leer en Bundle (en StackOverflow, etc.) sugiere que los paquetes no pueden hacer nada más que pasar por valor.

Entonces, ¿cuál es la estrategia más segura y más segura para pasar un objeto entre Actividades? Tal como lo veo yo podría

  1. Olvídate de pasar por referencia y vivir con cada Activity tener su propio objeto DataManager. Devuelva el nuevo DataManager cada vez que cierre una actividad para que la actividad subyacente pueda usarla. (La solución simple, creo).

  2. Vuelva a utilizar un singleton DataManager y utilice un método estático para obtenerlo de cada Activity. (No está interesado en usar singletons otra vez).

  3. Amplíe la aplicación para crear una especie de referencia global a DataManager. (De nuevo, no está interesado en la idea de los globales).

¿Es eso un sumario justo? ¿Hay alguna otra estrategia saludable que pueda usar?

+3

Solo una palabra acerca de la terminología: Java * always * usa el valor por pasaporte, ya sea que esté pasando referencias o tipos primitivos. Los objetos nunca pasan. Creo que sé a qué te refieres, pero usar pass-by-reference es un poco una distracción. –

+1

Preferiría usar el método Singleton, se usa clásicamente para clases de instancia única con un punto de acceso global. – Egor

+1

Si debe usar un Singleton, puede usar una subclase de aplicación. En mi experiencia, es mejor evitar las clases DAO en Android y usar ContentProviders. Están inherentemente disponibles en todas partes. –

Respuesta

4

Otro enfoque sería crear un servicio. La primera actividad iniciará el servicio y se vinculará a él, cuando se inicie un nuevo intento, se desvinculará la primera actividad y cuando comience la segunda actividad, se vinculará al servicio.

De esta forma no tiene que detener el servicio ni preocuparse por pasar datos entre actividades.

+0

esta es la mejor forma de Android para hacer las cosas .. Respeta las estrategias/concepto de gestión de memoria de Android –

0

Java no tiene pasar por referencia por lo que esa opción está fuera, yo sugeriría la inyección de dependencia para pasar datos entre las actividades. De lo contrario, definitivamente el singleton sería el camino a seguir.

+0

¿Qué tipo de inyección de dependencia estás sugiriendo? Para ser sincero, no me había dado cuenta de que era una opción para Android. ¿Es una opción simple? – Spinner

0

El prescrito es Going mediante la implementación de la interfaz parcelable, esa es la manera de pasar Objects between Activities .. y la segunda y mejor opción es hacer un Singleton para asegurarse de que es un solo objeto.

+0

¿Usaría Parcelable en lugar de Serializable significa que el único objeto se está pasando por alto, eliminando la necesidad de devolverlo a la actividad anterior después de usarlo? – Spinner

0

Cree su DataManager como Singleton que implementa Service. Enlace el servicio a su aplicación en el xml del manifiesto (consulte el enlace), y tendrá un singleton persistente al que pueden acceder sus actividades sin problemas.

Pasar argumentos parcelados puede ser muy complicado si necesita obtener una gran cantidad de datos. El enfoque singleton, aunque generalmente se considera un antipatrón, funciona como un amuleto en casos como estos. Recuerde no crear múltiples singletons que interactúan entre sí.

0

Sugeriría usar una subclase de aplicación. Le permite mantener una sola referencia a la clase DataManger y es persistente mientras viva su aplicación.

Un singleton con un campo estático también funcionará, pero hay un lugar en la documentación donde dice que el contenido de los campos estáticos no es un lugar seguro para almacenar sus datos. Como entiendo, los campos estáticos deberían persistir siempre que su ClassLoader permanezca en la memoria. Por lo tanto, un singleton solo debería desaparecer si todo el proceso abandona la memoria y en ese caso la clase de aplicación también abandonará la memoria, pero llamará a los métodos onDestroy de la Aplicación y eso le permitirá cerrar su DataManager de forma segura y conservar datos importantes para memoria.

Eso dijo a sus dos variaciones.

La forma de Android es hacer que su DataManager sea ContentProvider. Esto hará posible acceder a sus datos desde cada actividad sin tener una referencia global. No estoy seguro de cómo crearía un proveedor de contenido de almacenamiento en memoria caché que permanezca en la memoria y no se reincorpore con demasiada frecuencia.

Cuestiones relacionadas