Esta es una pregunta que he tenido para algunas aplicaciones diferentes que he creado, y aún no me he satisfecho con ninguna de las soluciones que he creado. Pensé que lo pondría allí a la comunidad para ver otras soluciones que podría haber.¿Buenas alternativas para compartir un árbol complejo de objetos entre actividades en Android?
Digamos que tiene una Actividad que descarga un árbol complejo de datos (en este caso vía json, pero podría ser cualquier cosa), deshace los datos a un conjunto de objetos java (en este caso usando gson, pero de nuevo, podría ser lo que sea), luego genera actividades adicionales para ver diferentes partes de esos datos. Puede haber una actividad para ver Trips en su respuesta, y otra para ver Vuelos en esos viajes, y tal vez otra para ver Pasajeros de esos vuelos.
Mi implementación inicial de esta aplicación fue deshacer todos los viajes en la primera actividad, y luego pasarlos por valor (como un extra en la intención) a TripActivity. TripActivity luego pasa vuelos individuales a FlightActivity, y así sucesivamente.
El problema es que hay una pausa notable entre actividades mientras la aplicación serializa y deserializa los datos. Estamos hablando de varios segundos. La pausa es bastante notable cuando mi árbol usa Serialización o Parcelable para pasar datos. Las pruebas iniciales de rendimiento con el uso de Parcelable de Google muestran una aceleración de aproximadamente 30% sobre la serialización, pero Parcelable es difícil de trabajar y no parece manejar referencias circulares de objetos como lo hace la serialización, y además hace pausas durante casi tantos segundos, así que puse ese experimento en el fondo mientras trato otras cosas.
Entonces intenté mover el árbol de objetos directamente a la clase de Aplicación. Cada actividad solo obtiene el árbol directamente de la aplicación cuando lo necesita. Esto hace que el rendimiento sea bastante rápido, pero manejar casos de esquina como inicio/detención de actividad inesperada (debido a bloqueos de actividad o porque la actividad se ha cerrado temporalmente para hacer más memoria disponible, o cualquier otra causa) parece complicado. Tal vez no es más que la implementación de onSaveInstanceState()
, no estoy seguro, pero la solución parece un poco hacky, así que no he investigado aún más.
Así que en la búsqueda de una solución menos improvisada, traté de crear un ContentProvider personalizado para almacenar y recuperar mis objetos. Dado que ContentProviders puede configurarse para ejecutarse en proceso usando multiprocess=true
, pensé que sería una forma excelente de evitar los costos de serialización mientras hacía algo más "estándar" que almacenar datos en el objeto Aplicación. Sin embargo, ContentProviders no pretendía devolver tipos de objetos arbitrarios, solo admiten tipos como números, cadenas, booleanos, etc. Parece que puedo arreglar uno para almacenar objetos arbitrarios usando ContentResolver.getContentProviderClient().getLocalContentProvider()
y accediendo directamente a mi clase personalizada, pero No estoy seguro de que sea menos hacky que almacenar datos en el objeto Aplicación.
Seguramente alguien debe tener una buena solución a este problema. ¿Qué estoy haciendo mal?
Sí, creo que estoy en un bote similar. Empecé haciendo todo en la aplicación, y ahora parece que un servicio es el camino correcto. Investigaré la refactorización en algún momento. ¡Gracias por el consejo! – emmby
También prefiero el servicio. ¿Qué quieres decir con "propio"? ¿Guarda los datos en un objeto estático en el servicio? Por lo general, un servicio analizará los datos y luego los enviará en una transmisión, y luego se usará un controlador en el hilo de la interfaz de usuario para mostrar los datos o lo que sea. Pero si vuelvo a llamar al servicio, ¿dónde vuelve a obtener el servicio esa información? ¿Se guardan estos datos en un objeto estático en el servicio? No queremos volver a analizar el JSON .. –