Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Cachez ces images que je ne saurais voir ! (WinRT et le cache image)

[new:30/11/2012] WinRT utilise un cache pour les images lues depuis une URL. Cela améliore l’expérience utilisateur et limite la bande passante consommée mais ce n’est pas toujours un comportement souhaitable…

Cache-cache, par défaut

Windows 8 est un peu blagueur et ne cesse de jouer à “cache-cache” avec les images téléchargées… Bien entendu c’est “pour le bien” de l’utilisateur, quand une image est relue plusieurs fois seule la première est réellement chargée, les autres accès sont bloqués et servis par le cache ce qui accélère grandement l’expérience utilisateur.

Pas toujours souhaitable

Cacher n’est pas jouer pourrait-on dire. En effet, si ce comportement par défaut est parfaitement raisonnable pour bon nombre d’applications, cela devient une gêne importante dans d’autres cas. Pensons à une simple image météo rafraichie régulièrement ou un graphique de statistiques mis à jour à intervalles réguliers. Toutes ces images provenant de la même URL, elles seront retournées telles qu’elles sont dans le cache, c’est à dire sans les modifications intervenues depuis la première lecture.

Fâcheux donc dans certains cas puisque c’est le fonctionnement même d’un logiciel qui peut apparaitre bogué alors que tout semble programmé correctement…

Accéder au cache dans l’URL

Il existe une première feinte publiée par Ian Walkers sur son blog et qui est assez intéressante : visiblement WinRT interprète les URL avant de leur donner accès au Web. Mieux, il sait comprendre un paramètre de cache qui permet de contrôler finement la durée de mise en cache.[EDIT]je disais "visiblement", c'est à dire "de ce qu'on peut voir", parfois ce qu'on voit est trompeur d'où mes précautions. Ici il semble que WinRT ne fait rien du tout. Mais cela fonctionne tout de même...[/EDIT]

Il suffit pour cela d’ajouter à l’URL de l’image les informations suivantes :

“?cache=” + DateTime.Now.DayOfYear.ToString()+DateTime.Now.Hour.ToString(); 

Dans cet exemple cela indique un cache d’une durée de une heure…

En utilisant une valeur en ticks égale à l’heure courante on s’assure qu’il n’y a pas de caching.

Cette feinte est intéressante mais elle mériterait d’être précisée par un accès à la documentation qui la décrit. Je n’ai pas trouvé une telle documentation pour l’instant. J’y reviendrai si je le trouve, ou si un lecteur la trouve entre-temps !

Accéder au cache via l’objet BitmapImage

La classe BitmapImage offre d’autres moyens, mieux documentés, de gérer le cache. Notamment via les propriétés CacheOptions et CreateOptions.

On peut dès lors paramétrer plus finement les choses avec des niveaux comme “OnDemand, OnLoad ou None” (en plus de “Default”).

Conclusion

C’est un petit pas pour le blogger mais c’est un pas géant pour les applis qui se croyaient boguées alors qu’elles ne l’étaient pas…

Stay Tuned !

blog comments powered by Disqus