Glide: Comment trouver 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 - Chargement D'Image et bibliothèque de mise en cache. Après cela chaque fois que l'utilisateur ouvre l'application, je veux montrer la version mise en cache si présent. Cette URL GIF expirera après un intervalle donné. Quand il expire, je récupère la nouvelle URL GIF et display/cache qui sera utilisée à l'avenir.

Ce Que Je essayé:

je suis passé par la mise en Cache et l'Invalidation du Cache Glisse sur la page github. Je suis également allé à travers le fil de Google Group S'assurer que les Images chargées viennent seulement de Cache de disque , qui montre comment obtenir le cache de forme d'image. Je suis également passé par comment invalider cache Glide pour certaines images spécifiques question.

des liens ci-dessus je vois le code suivant sniplet qui montre comment charger l'image depuis le cache. Cependant, cela ne tente que de récupérer l'image dans le cache. Si elle n'est pas présente dans le cache, elle n'essaie pas de sortir 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. est-ce qu'il y a une façon plus propre d'obtenir ce qui suit: afficher l'image GIF dans le cache s'il y en a une autre Télécharger le GIF, le mettre en cache pour une utilisation ultérieure et l'afficher dans le ImageView .

  2. L'article ci-dessus mentionne ce qui suit:

    dans la 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 la vieille image finira par être ramassée? Est-il un moyen de forcer à retirer l'image du cache?

  3. sur une note similaire, y a-t-il un moyen d'empêcher la collecte D'ordures d'une image avec une clé spécifique (pour empêcher le téléchargement du gros fichier à nouveau) et ensuite d'ordonner de supprimer l'Ancienne image de cache lorsque l'URL change?

21
demandé sur Community 2015-09-04 23:57:47

2 réponses

  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. Juste utiliser une ligne de Charge standard devrait fonctionner amende:

    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 ne montrera le GIF que s'il est déjà en cache, ce que vous ne voulez pas.

  1. Oui, l'Ancienne image sera éventuellement retirée. Par défaut, Glide utilise un cache LRU, de sorte que lorsque le cache est plein, l'image la moins récente utilisée sera supprimée. Vous pouvez facilement personnaliser la taille du cache pour l'aider si vous voulez. Voir la page wiki Configuration 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 pas supprimer un élément explicitement, ou en forcer le maintien. Dans la pratique, avec une taille du cache disque vous n'avez généralement pas besoin de vous soucier de faire, soit. Si vous affichez votre image assez souvent, il ne sera pas expulsé. Si vous essayez de mettre en cache des éléments supplémentaires et de manquer d'espace dans le cache, les anciens éléments seront expulsés automatiquement pour faire de l'espace.

27
répondu Sam Judd 2015-09-09 15:16:24
 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 la mémoire cache. Cela signifie que Glide ne mettra pas l'image dans la mémoire cache. Il est important de comprendre, que cela n'affecte la mémoire cache! Glide utilisera toujours le cache disque pour éviter une autre requête réseau pour la requête suivante à la même URL d'image.pour plus lire ceci Glisse Cache et de demande d'optimisation .

bon codage!!

1
répondu Hemant Parmar 2017-11-01 11:30:13