2012-03-23 16 views
9

Desidero memorizzare nella cache i dati da un servizio web json nella mia app Android. La prima volta, l'applicazione viene avviata, dovrebbe attendere che tutti i dati siano stati caricati dal servizio. Dopo il caricamento iniziale, l'app dovrebbe verificare di tanto in tanto (alcuni giorni) se sono disponibili nuovi dati. Se sì, i dati memorizzati localmente dovrebbero essere aggiornati e caricati la prossima volta che l'app viene avviata.caching JSON da webservice su android - pattern?

Attualmente sto cercando di risolvere questo da un IntentService e salvando i dati caricati in un file - ma non è un modo molto pulito e bello!

Qualcuno conosce un modo pulito per farlo? Un modello di cache?

+1

aggiungere un ContentProvider per memorizzare i dati in un database. Probabilmente è più bello - è solo un sacco di lavoro quando puoi semplicemente salvare un file (che di per sé è già un modello di cache) – zapl

risposta

8

Ecco un semplice modo per fare ciò che non comporta un servizio, le discussioni, gli allarmi, ecc basta definire un wrapper per il vostro JSON, come,

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

l'attuazione getJson() esegue le seguenti operazioni,

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; 
} 

in altre parole, recupera pigro il nuovo json dalla rete quando è necessario. questo è molto più semplice dell'aggiornamento periodico di un file di cache impostando allarmi ed eseguendo un servizio per aggiornare la cache ...

dall'app, si fa la stessa cosa sia che si tratti del primo carico o dell'ennesimo carico di dati. si chiama getJson(),

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

l'unico inconveniente è che di tanto in tanto, la chiamata per ottenere il JSON ci vorrà più tempo, e di conseguenza è necessario eseguire in un thread in modo da non ANR l'interfaccia utente ... ma si dovrebbe fallo comunque, perché se si trova in un file o recuperato dalla rete, dovresti evitare di fare IO nel thread dell'interfaccia utente.