2012-03-23 25 views
9

Quiero almacenar en caché los datos de un servicio json-web en mi aplicación de Android. La primera vez que se inicia la aplicación, debe esperar hasta que se carguen todos los datos del servicio. Después de esa carga inicial, la aplicación debe verificar de vez en cuando (algunos días) si hay nuevos datos disponibles. En caso afirmativo, los datos almacenados localmente deben actualizarse y cargarse la próxima vez que se inicie la aplicación.almacenamiento en caché JSON desde webservice en android - pattern?

Actualmente estoy tratando de resolver esto mediante un servicio de intendencia y guardando los datos cargados en un archivo, pero no es una forma muy limpia y hermosa.

¿Alguien sabe una manera limpia de hacer esto? ¿Un patrón de almacenamiento en caché?

+1

agregue un ContentProvider para almacenar los datos en una base de datos. Eso es probablemente más hermoso, es mucho trabajo cuando simplemente puedes guardar un archivo (que ya es un patrón de almacenamiento en caché) – zapl

Respuesta

8

Aquí hay una forma sencilla de hacer esto que no implica un servicio, hilos, alarmas, etc. simplemente definen una envoltura alrededor de su JSON, como,

class MyJson { 
    JSONObject getJson() { ... }; 
} 

la implementación de getJson() hace lo siguiente,

if (cached json file exists) { 
    if (json file last modified + 1 day > current time) { 
    json = get from network; 
    cache json in file; 
    } else [ 
    json = get from file; 
    } 
} else { 
    json = get from network; 
    cache json in file; 
} 

en otras palabras, perezoso-Recuperar el JSON fresca de la red cuando lo necesite. esto es mucho más simple que actualizar periódicamente un archivo de caché estableciendo alarmas y ejecutando un servicio para actualizar el caché ...

desde su aplicación, usted hace lo mismo ya sea la primera carga o la enésima carga de datos. se llama a getJson(),

new Thread(new Runnable() { 
    public void run() { 
    json = getJson(); 
    // do whatever you need to do after the json is loaded 
    } 
}).start(); 

el único inconveniente es que, en ocasiones, la llamada para obtener el JSON tomará más tiempo, y por lo tanto se debe ejecutar en un hilo para que no se ANR la interfaz de usuario ... pero debería hazlo de todos modos, ya sea que esté en un archivo o que haya sido obtenido de la red, debes evitar hacer IO en el hilo de la interfaz de usuario.

Cuestiones relacionadas