Evitare i download non ottimizzati

Alcuni utenti della tua app hanno un accesso intermittente a internet o hanno limitazioni sulla 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 da scaricare.

Il modo più fondamentale per ridurre i download è scaricare solo ciò che ti serve. Per quanto riguarda i dati, ciò significa implementare API REST che permettono di specificare criteri di query che limitano i dati restituiti utilizzando parametri come l'ora dell'ultimo aggiornamento.

Analogamente, quando si scaricano le immagini, è buona norma ridurre le dimensioni delle immagini lato server, invece di scaricare immagini a grandezza originale che vengono ridotte sul client.

Memorizza nella cache le risposte HTTP

Un'altra tecnica importante è evitare di scaricare dati duplicati. Puoi ridurre la probabilità di scaricare ripetutamente gli stessi dati utilizzando la memorizzazione nella cache. La memorizzazione nella cache di dati e risorse dell'app consente di creare una copia locale delle informazioni a cui l'app ha bisogno di fare riferimento. Se la tua app deve accedere più volte alla stessa informazione in un breve periodo di tempo, dovrai scaricarla nella cache una sola volta.

È importante memorizzare nella cache il più possibile in modo aggressivo per ridurre la quantità totale di dati scaricati. Memorizza sempre nella cache le risorse statiche, inclusi i download on demand come le immagini a dimensione intera, per il tempo ragionevolmente possibile. Le risorse on demand dovrebbero 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 inattivi nell'app, utilizza i codici e le intestazioni di stato HTTP appropriati, come le intestazioni ETag e Last-Modified. In questo modo puoi determinare quando aggiornare i contenuti associati. Ecco alcuni esempi:

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 rete in modo che rispettino automaticamente questi codici di stato e queste intestazioni. Quando utilizzi OkHttp, ad esempio, se configuri una directory della cache e le dimensioni della cache per il client, la libreria potrà 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 richieste HTTP interamente memorizzate nella cache direttamente dallo spazio di archiviazione locale, eliminando la necessità di aprire una connessione di rete. Le risposte memorizzate nella cache possono convalidare il relativo aggiornamento dal server, eliminando il costo della larghezza di banda associato al download. Le risposte non memorizzate nella cache vengono memorizzate 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 sicura utilizzando Context.getCacheDir(). Tieni presente che questa cache interna può essere svuotata quando lo spazio di archiviazione disponibile sul sistema è insufficiente.

Utilizza un repository

Per un approccio più sofisticato alla memorizzazione nella cache, considera il modello 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 suoi 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 reindirizzamento indiretto ti consente di fornire una solida strategia di memorizzazione nella cache specifica per la tua app. Per ulteriori informazioni sull'utilizzo del pattern del repository all'interno dell'app, consulta la guida all'architettura delle app.