web-dev-qa-db-fra.com

Glide: Comment savoir si l'image est déjà mise en cache et utiliser la version mise en cache?

Scénario :

J'ai une grande image GIF que je veux mettre en cache la première fois que l'utilisateur ouvre l'application en utilisant Glide - Bibliothèque de chargement et de mise en cache d'images. Après cela, chaque fois que l'utilisateur ouvre l'application, je souhaite afficher la version en cache si elle est présente. Cette URL GIF expirera après un intervalle donné. Quand il expire, je récupère la nouvelle URL GIF et affiche/cache que pour une utilisation future.

Ce que j'ai essayé:

J'ai parcouru Caching et Cache Invalidation sur la page github de Glide. J'ai également consulté le fil de discussion du groupe Google S'assurer que les images chargées ne proviennent que du cache de disque , qui montre comment obtenir le cache de formulaire d'image. J'ai également parcouru Comment invalider le cache Glide pour certaines images spécifiques question.

À partir des liens ci-dessus, je vois l'extrait de code suivant qui montre comment charger l'image à partir du cache. Cependant, cela essaie uniquement d'obtenir l'image du cache. S'il n'est pas présent dans le cache, il n'essaie pas d'obtenir du réseau et échoue:

Glide.with(TheActivity.this)
        .using(new StreamModelLoader<String>() {
            @Override
            public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) {
                return new DataFetcher<InputStream>() {
                    @Override
                    public InputStream loadData(Priority priority) throws Exception {
                        throw new IOException();
                    }

                    @Override
                    public void cleanup() {
                    }

                    @Override
                    public String getId() {
                        return model;
                    }

                    @Override
                    public void cancel() {
                    }
                };
            }
        })
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);

Questions:

  1. Existe-t-il un moyen plus propre d'atteindre les objectifs suivants: Afficher l'image GIF à partir du cache si elle est présente sinon télécharger le GIF, le mettre en cache pour une utilisation ultérieure et l'afficher dans le ImageView.

  2. L'article de mise en cache ci-dessus mentionne les éléments suivants:

    En pratique, la meilleure façon d'invalider un fichier cache est de changer votre identifiant lorsque le contenu change (url, uri, chemin du fichier, etc.)

    Le serveur envoie une URL différente à l'application lorsque la précédente expire. Dans ce cas, je crois que l'ancienne image sera finalement récupérée? Existe-t-il un moyen de forcer la suppression de l'image du cache?

  3. Sur une note similaire, existe-t-il un moyen d'empêcher la récupération de place d'une image avec une clé spécifique (pour éviter de télécharger à nouveau le fichier volumineux), puis de demander ultérieurement de supprimer l'ancienne image du cache lorsque l'URL change?

25
Shobhit Puri
  1. Vous n'avez pas besoin d'un ModelLoader personnalisé pour afficher le GIF du cache s'il est présent et le récupérer autrement, c'est en fait le comportement par défaut de Glide. L'utilisation d'une ligne de charge standard devrait fonctionner correctement:

    Glide.with(TheActivity.this)
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);
    

Votre code empêchera Glide de télécharger le GIF et n'affichera le GIF que s'il est déjà mis en cache, ce qui semble ne pas être le cas.

  1. Oui, l'ancienne image sera finalement supprimée. Par défaut, Glide utilise un cache LRU, donc lorsque le cache est plein, l'image la moins récemment utilisée sera supprimée. Vous pouvez facilement personnaliser la taille du cache pour vous aider si vous le souhaitez. Voir la page Configuration wiki pour savoir comment changer la taille du cache.

  2. Malheureusement, il n'y a aucun moyen d'influencer directement le contenu du cache. Vous ne pouvez ni supprimer un élément explicitement, ni forcer sa conservation. En pratique, avec une taille de cache disque appropriée, vous n'avez généralement pas à vous soucier de faire non plus. Si vous affichez votre image assez souvent, elle ne sera pas expulsée. Si vous essayez de mettre en cache des éléments supplémentaires et que vous manquez d'espace dans le cache, les éléments plus anciens seront automatiquement supprimés pour libérer de l'espace.

33
Sam Judd
 Glide.with(context)
 .load("http://sampleurl.com/sample.gif")
 .skipMemoryCache(true)
 .into(imageView);

Vous avez déjà remarqué que nous avons appelé .skipMemoryCache (true) pour dire spécifiquement à Glide de sauter le cache mémoire. Cela signifie que Glide ne mettra pas l'image dans le cache mémoire. Il est important de comprendre que cela n'affecte que le cache mémoire! Glide utilisera toujours le cache disque pour éviter une autre requête réseau pour la prochaine requête vers la même URL d'image.Pour plus lire ceci Glide Cache & Request Optimization .

Bon codage !!

1
Hemant Parmar