2014-07-25 13 views
8

Vorrei sapere esattamente come Picasso Library sta memorizzando nella cache le immagini all'interno dell'applicazione. So che ha usato HttpHeaders per controllare il tempo per recuperare le immagini dalla rete.Come Picasso effettivamente memorizza le immagini nella cache

Ma c'è qualche tempo in cui si memorizzano le immagini nella cache?
Come invalidere la cache dopo un giorno o qualcosa del genere?

Il problema è che il mio progetto sta caricando un numero enorme di piccole immagini dalla rete. Alcune volte, le nuove immagini si sono riflesse nel prossimo lancio. Ma alcune volte no.

La parte peggiore è che alcune immagini hanno riflettuto le modifiche mentre altre non sono anche se le modifiche vengono apportate allo stesso tempo.
Ma, quando ho disinstallare l'applicazione, tutte le immagini ottenuto riflette i cambiamenti (ovviamente.)

Ci deve essere qualcosa sulla memorizzazione nella cache a Picasso.

E per favore non dirmi di usare OkHttp per controllare la cache in Picasso.
Il mio progetto utilizza AsyncHttpClient da Apache ed è troppo dannatamente grande per l'aggiornamento.
(non da me, ovviamente, vorrei solo creare un piccolo helper di rete con UrlConnection invece di implementare l'intero AsyncHttpClient.)

In ogni caso, qualsiasi idea o puntatore sarebbe apprezzata.
Bottom Line: No OkHttp. Voglio solo sapere sul meccanismo di controllo della cache su Picasso.

saluti

risposta

4

Per quanto ne so Picasso non cancella la cache di per sé, quindi nel nostro app stiamo innescando che "manualmente". Il codice per farlo è questo:

private static final String PICASSO_CACHE = "picasso-cache"; 

public static void clearCache(Context context) { 
    final File cache = new File(
      context.getApplicationContext().getCacheDir(), 
      PICASSO_CACHE); 
    if (cache.exists()) { 
     deleteFolder(cache); 
    } 
} 

private static void deleteFolder(File fileOrDirectory) { 
    if (fileOrDirectory.isDirectory()) { 
     for (File child : fileOrDirectory.listFiles()) 
      deleteFolder(child); 
    } 
    fileOrDirectory.delete(); 
} 

È possibile attivare questo operaio di pulizia una volta al giorno/settimana, a seconda di cosa avete bisogno nel vostro app.

+3

Questo funziona solo se si utilizza OkHttp o HttpUrlConnection che il post afferma esplicitamente che non lo è. –

+0

Abbastanza giusti, stiamo usando OkHttp. – Ciprian

+0

Funziona anche per il mio AsynHttpClient.:-) –

14

Picasso ha solo una memoria cache.

Se l'immagine si trova nella memoria cache, viene utilizzata. Altrimenti, quando l'immagine viene caricata dalla sua sorgente remota (rete, provider di contenuti, file system, ecc.) Viene inserita nella cache di memoria per future ricerche.

La memoria cache è una LRU, quindi più un'immagine viene utilizzata più è probabile che rimanga nella cache. Le immagini che non vengono richieste spesso verranno sfrattate nel tempo. Non c'è sfratto per il tempo e la memoria cache non rispetta la semantica della cache di qualsiasi intestazione HTTP (se l'immagine proviene dalla rete).

Picasso non ha una cache del disco. Si affida al client HTTP (a seconda di quale viene utilizzato) per il 100% di questa funzionalità. Verrà installata una cache sia per OkHttp che per HttpUrlConnection (se usata) o se già utilizzata.

Se si utilizza un client HTTP personalizzato, l'onere di abilitare la cache è a carico del chiamante.

+0

Grazie Jake. È abbastanza esplicativo in sé. Ma, puoi un po 'più di dettagli sul fatto che "la memoria cache non onora la semantica della cache di qualsiasi header HTTP"? E anche su "Una cache verrà installata sia per OkHttp che per HttpUrlConneciton"? Francamente, non voglio affatto toccare quel meccanismo AsyncHttpClient. E vedo che c'è un'interfaccia "Cache" in Picasso Source e LruCache lo sta implementando. Sarebbe saggio implementare il mio meccanismo di cache biforcando Picasso? Se implemento la mia cache, posso inserire un trigger per cancellarlo in base a un intervallo di tempo come il modo in cui Ciprian ha menzionato in seguito? –

+0

@JakeWharton, rock, potresti essere interessato alla mia domanda "aggiuntiva" in parentesi graffa alla fine di ... http://stackoverflow.com/questions/25746356 È un vero mistero per me. Saluti!!!! grazie come sempre dai tuoi fan urlanti – Fattie