Alcuni utenti della tua app hanno accesso intermittente a internet o limiti alla quantità di informazioni che possono scaricare sui propri dispositivi. Puoi incoraggiare gli utenti a interagire più spesso con la tua app riducendo la quantità di dati che l'app deve scaricare.
Il modo più semplice per ridurre i download è scaricare solo ciò che ti serve. In termini di dati, ciò significa implementare API REST che ti consentono di specificare criteri di query che limitano i dati restituiti utilizzando parametri come l'ora dell'ultimo aggiornamento.
Allo stesso modo, quando scarichi le immagini, è buona norma ridurre le dimensioni delle immagini lato server, anziché scaricare immagini a grandezza naturale che vengono ridotte sul client.
Memorizzare nella cache le risposte HTTP
Un'altra tecnica importante è evitare di scaricare dati duplicati. Puoi ridurre la probabilità di scaricare ripetutamente lo stesso dato utilizzando la memorizzazione nella cache. Memorizzando nella cache i dati e le risorse della tua app, crei una copia locale delle informazioni a cui la tua app deve fare riferimento. Se la tua app deve accedere alla stessa informazione più volte in un breve periodo di tempo, devi scaricarla nella cache una sola volta.
È importante memorizzare nella cache il maggior numero possibile di dati per ridurre la quantità totale di dati scaricati. Memorizza sempre nella cache le risorse statiche, inclusi i download on demand come le immagini a grandezza naturale, per il maggior tempo ragionevolmente possibile. Le risorse on demand devono essere archiviate separatamente per consentirti di svuotare regolarmente la cache on demand per gestirne le dimensioni.
Per assicurarti che la memorizzazione nella cache non comporti la visualizzazione di dati obsoleti nella tua app,
utilizza i codici di stato HTTP e le
intestazioni
appropriati,
come le
intestazioni
ETag
e
Last-Modified
. In questo modo, puoi determinare quando devono essere aggiornati i contenuti associati. Ad esempio:
Kotlin
// url represents the website containing the content to place into the cache. val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection val currentTime: Long = System.currentTimeMillis() val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime) // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified }
Java
// url represents the website containing the content to place into the cache. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); long currentTime = System.currentTimeMillis(); long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime); // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified; }
Puoi configurare alcune librerie di networking in modo che rispettino automaticamente questi codici di stato e intestazioni. Quando utilizzi OkHttp, ad esempio, la configurazione di una directory della cache e delle dimensioni della cache per il client consentirà alla libreria di utilizzare la memorizzazione nella cache HTTP, come mostrato nel seguente esempio di codice:
Kotlin
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
Java
File cacheDir = Context.getCacheDir(); long cacheSize = 10L * 1024L * 1024L; // 10 MiB OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) .build();
Con la cache configurata, puoi gestire le richieste HTTP memorizzate nella cache direttamente dall'archivio locale, eliminando la necessità di aprire una connessione di rete. Le risposte memorizzate nella cache in modo condizionale possono convalidare la loro freschezza dal server, eliminando il costo della larghezza di banda associato al download. Le risposte non memorizzate nella cache vengono archiviate nella cache delle risposte per le richieste future.
Puoi memorizzare nella cache i dati non sensibili nella directory della cache esterna non gestita utilizzando
Context.getExternalCacheDir()
.
In alternativa, puoi memorizzare i dati nella cache dell'applicazione gestita e protetta utilizzando
Context.getCacheDir()
.
Tieni presente che questa cache interna potrebbe essere svuotata quando lo spazio di archiviazione disponibile
del sistema è quasi esaurito.
Utilizzare un repository
Per un approccio più sofisticato alla memorizzazione nella cache, valuta la possibilità di utilizzare il pattern di progettazione del repository. Ciò comporta la creazione di una classe personalizzata, nota come Repository, che fornisce un'astrazione API su alcuni dati o risorse specifici. Il repository potrebbe inizialmente recuperare i dati da varie origini, ad esempio un servizio web remoto, ma fornisce ai chiamanti una versione memorizzata nella cache dei dati nelle chiamate successive. Questo livello di indirezione ti consente di fornire una solida strategia di memorizzazione nella cache specifica per la tua app. Per ulteriori informazioni sull'utilizzo del pattern Repository all'interno della tua app, consulta la Guida all'architettura dell'app.