Certains utilisateurs de votre application ont un accès intermittent à Internet ou sont limités quant à la quantité d'informations qu'ils peuvent télécharger sur leurs appareils. Vous pouvez encourager les utilisateurs à interagir plus souvent avec votre application en réduisant la quantité de données qu'elle doit télécharger.
La méthode la plus fondamentale pour réduire vos téléchargements consiste à ne télécharger que ce dont vous avez besoin. En termes de données, cela signifie implémenter des API REST qui vous permettent de spécifier des critères de requête limitant les données renvoyées à l'aide de paramètres tels que l'heure de votre dernière mise à jour.
De même, lorsque vous téléchargez des images, il est recommandé de réduire la taille des images côté serveur plutôt que de télécharger des images en taille réelle qui sont réduites sur le client.
Mettre en cache les réponses HTTP
Une autre technique importante consiste à éviter de télécharger des données en double. Vous pouvez réduire la probabilité de télécharger plusieurs fois les mêmes données en utilisant la mise en cache. En mettant en cache les données et les ressources de votre application, vous créez une copie locale de les informations auxquelles votre application doit faire référence. Si votre application doit accéder plusieurs fois aux mêmes informations sur une courte période, vous ne devez les télécharger qu'une seule fois dans le cache.
Il est important de mettre en cache de manière aussi agressive que possible afin de réduire la quantité totale de données que vous téléchargez. Mettez toujours en cache les ressources statiques, y compris les téléchargements à la demande tels que les images en taille réelle, aussi longtemps que possible. Les ressources à la demande doivent être stockées séparément pour vous permettre de vider régulièrement votre cache à la demande afin de gérer sa taille.
Pour vous assurer que votre mise en cache n'entraîne pas l'affichage de données obsolètes dans votre application,
utilisez les codes d'état et
les en-têtes HTTP appropriés,
tels que les en-têtes
ETag
et
Last-Modified. Cela vous permet de déterminer quand le contenu associé doit être
actualisé. Exemple :
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; }
Vous pouvez configurer certaines bibliothèques réseau pour qu'elles respectent automatiquement ces codes d'état et en-têtes. Lorsque vous utilisez OkHttp, par exemple, la configuration d'un répertoire de cache et d'une taille de cache pour le client permet à la bibliothèque d'utiliser la mise en cache HTTP, comme illustré dans l'exemple de code suivant :
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();
Une fois le cache configuré, vous pouvez diffuser des requêtes HTTP entièrement mises en cache directement à partir du stockage local, ce qui élimine le besoin d'ouvrir une connexion réseau. Les réponses mises en cache de manière conditionnelle peuvent valider leur fraîcheur à partir du serveur, ce qui élimine le coût de bande passante associé au téléchargement. Les réponses non mises en cache sont stockées dans le cache de réponse pour les futures requêtes.
Vous pouvez mettre en cache des données non sensibles dans le répertoire de cache externe non géré à l'aide de
using
Context.getExternalCacheDir().
Vous pouvez également mettre en cache des données dans le cache d'application géré et sécurisé en
utilisant
Context.getCacheDir().
Notez que ce cache interne peut être vidé lorsque le système manque d'espace de stockage
disponible.
Utiliser un dépôt
Pour une approche plus sophistiquée de la mise en cache, envisagez le modèle de conception de dépôt. Cela implique de créer une classe personnalisée, appelée dépôt, qui fournit une abstraction d'API par rapport à des données ou des ressources spécifiques. Le dépôt peut initialement extraire ses données de différentes sources, telles qu'un service Web distant, mais fournit aux appelants une version mise en cache des données lors des appels suivants. Cette couche d'indirection vous permet de fournir une stratégie de mise en cache robuste et spécifique à votre application. Pour en savoir plus sur l'utilisation du modèle de dépôt dans votre application, consultez le Guide de l'architecture des applications.