2011-02-02 15 views
10

Estoy pensando en cómo implementar de manera ideal una capa de caché en mi aplicación de Android.Estrategia de almacenamiento en caché para la aplicación de Android

Actualmente tengo actividades genéricas que muestran datos procedentes de un servidor remoto. Los datos están representados por una DTO TemplateInstance. Cada TemplateInstance tiene un Mapa con Componentes y cada uno de los componentes puede tener componentes secundarios. Los componentes en sí mismos pueden ser Texto (Cadena), Imagen (Array Byte) o Tiempo (o lo que sea subcomponiendo Componente).

Actualmente mi aplicación carga una TemplateInstance desde el servidor cada vez que se inicia una actividad.

ahora me gustaría aplicar una capa caché en la aplicación, de manera que

  1. el tiempo para mostrar los datos se reduce al mínimo,
  2. los datos se actualizan cuando se se cambia en el servidor.

Mi estrategia para esto se parece a esto:

  • El comenzó Actividad carga el TemplateInstance de un almacenamiento local mediante un ID (si existe)
  • A cheques UpdateService en el fondo si el TemplateInstance ha cambiado en el servidor (usando un campo de versión en la base de datos)
  • Si la versión del servidor es mayor que la local o no hay TemplateInstance local, entonces recupere los datos del servidor, actualice la tienda local y actualice la vista

Implementé esto ya con éxito con db4o. Hay sólo dos problemas con esta solución:

  • db4o es bajo licencia GPL (no puedo usarlo)
  • db4o es muy lento cuando cargo TemplateInstances que tienen muchas imágenes (4 segundos para una consulta)

Ahora estoy buscando el mejor reemplazo para db4o. Mis ideas acerca de que son hasta ahora:

  • SQLite no es adecuado debido a la estructura de los datos
  • No necesito la funcionalidad de base de datos - la recuperación de objetos por ID sería suficiente
  • Sosteniendo los objetos en la memoria sería significativamente más rápido
  • el estado de la memoria debe ser guardado en el disco cuando sale de la aplicación, por lo que los objetos pueden ser reinstantiated en el arranque

¿te ha gustado es la mejor solución ¿para esto?

Mi investigación sobre este me llevó a EHCache y JCS, que nunca he usado. ¿Crees que son apropiados, también con respecto a los recursos en un teléfono Android? ¿O tienes otras sugerencias?

+0

Puede encontrar la implementación de caché de la aplicación de Android desde [aquí] (https://stackoverflow.com/a/45086960/5835760). –

Respuesta

4

Si entiendo su situación correctamente, creo que debería implementar su propia solución de almacenamiento en caché.

Yo usaría un HashMap<id, TemplateInstance>. HashMap es serializable y puede almacenarlo/cargarlo usando ObjectOutputStream y ObjectInputStream, respectivamente.

+0

Gracias! Esa es una idea muy clara. Terminé construyendo una estructura de datos con varios HashMaps y ArrayLists y guardo este objeto de caché con ObjectOutputStream. ¡Funciona de maravilla! – Konsumierer

+0

Lamentablemente, resultó que la solución no es la mejor, cuando hay una gran cantidad de datos para almacenar en caché como imágenes, porque hay un límite de VM de la cantidad de memoria que puede usar una aplicación. – Konsumierer

+3

Debe usar archivos para almacenar en caché imágenes, no objetos serializables. – goncalossilva

2

db4o no se limita a GPL, a través de su dOCL se puede optar por otras licencias de código abierto y, si no se puede ir de código abierto a todos, también es totalmente free for Android apps

0

Puede usar el tenedor de simple-disk-cache Este es un caché de disco fácil de usar que usa DiskLruCache debajo del capó.

He sustituido la dependencia de Apache Commons IO con google guava. Y tienen añadir nuevos métodos comunes: put(String key, String value, Object[] array) - el valor que tengo uso de poner la marca de tiempo para un máximo de TTL (después de este tiempo en ms la caché caducado) y: T getArray(String key, Class type)

Usted puede poner matriz a partir de objetos serializables como este:

cache.put("key", String.valueOf(new Date().getTime() + 60000), Groups[] arrayGroups); 

y conseguir que: Groups[] cacheArray = getCacheArray("key", Groups[].class);

que puede poner en imágenes de mapa de bits de memoria caché también.

Cuestiones relacionadas