Evitare i download non ottimizzati

Alcuni utenti della tua app hanno accesso intermittente a internet o hanno dei limiti sulla quantità di informazioni che possono scaricare sui loro dispositivi. Puoi incoraggiare gli utenti a interagire con la tua app più spesso riducendo la quantità di i dati necessari per il download dell'app.

Il modo fondamentale per ridurre i download è scaricare solo ciò che necessaria. In termini di dati, ciò significa implementare API REST che consentono specificare criteri di query che limitano i dati restituiti utilizzando parametri come l'ora dell'ultimo aggiornamento.

Analogamente, quando scarichi immagini, è buona norma ridurre le dimensioni immagini lato server, anziché scaricare immagini a grandezza originale che riducono sul cliente.

Memorizzazione nella cache delle risposte HTTP

Un'altra tecnica importante è evitare di scaricare dati duplicati. Puoi per ridurre la probabilità di scaricare gli stessi dati ripetutamente utilizzando per la memorizzazione nella cache. Se memorizzi nella cache i dati e le risorse dell'app, crei una copia locale le informazioni a cui l'app deve fare riferimento. Se la tua app richiede l'accesso la stessa informazione più volte in un breve periodo di tempo, per scaricarlo nella cache una sola volta.

È importante memorizzare nella cache il più aggressivo possibile per ridurre il numero totale quantità di dati scaricati. Memorizza sempre nella cache le risorse statiche, i download on demand, come le immagini a grandezza originale, per un periodo di tempo ragionevole possibile. Le risorse on demand devono essere archiviate separatamente per consentirti di svuota regolarmente la cache on demand per gestirne le dimensioni.

Per assicurarti che la memorizzazione nella cache non causi la visualizzazione di dati inattivi nell'app: utilizza i codici di stato HTTP e intestazioni, come ETag: e Last-Modified intestazioni. Ciò ti consente di determinare quando i contenuti associati devono essere aggiornato. 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 rete in modo che rispettino questi codici di stato e automaticamente le intestazioni. Quando si utilizza OkHttp, ad esempio la configurazione una directory della cache e le dimensioni della cache per il client consentono alla libreria di utilizzare Memorizzazione nella cache HTTP, come mostrato nell'esempio di codice seguente:

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 direttamente richieste HTTP memorizzate nella cache dallo spazio di archiviazione locale, eliminando così la necessità di aprire una connessione di rete. Le risposte memorizzate nella cache in modo condizionale possono convalidarne l'aggiornamento dal server, eliminando il costo della larghezza di banda associato al download. Risposte non memorizzate nella cache vengono archiviati nella cache delle risposte per le richieste future.

Puoi memorizzare nella cache dati non sensibili nella directory della cache esterna non gestita utilizzando Context.getExternalCacheDir() In alternativa, puoi memorizzare i dati nella cache dell'applicazione sicura gestita utilizzando Context.getCacheDir() Tieni presente che questa cache interna potrebbe essere svuotata quando il sistema sta per esaurirsi. spazio di archiviazione disponibile.

Utilizza un repository

Per un approccio più sofisticato alla memorizzazione nella cache, considera la progettazione del repository pattern. Ciò comporta la creazione di una classe personalizzata, nota come Repository, fornisce un'astrazione dell'API su 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 dei dati memorizzata nella cache nelle chiamate successive. Questo di memorizzazione nella cache consente di fornire una solida strategia di memorizzazione nella cache specifiche della tua app. Per ulteriori informazioni sull'uso del pattern del repository all'interno dell'app, consulta la Guida all'app dell'architettura.