Maison  >  Article  >  类库下载  >  Exploration approfondie du mécanisme de mise en cache de Glide

Exploration approfondie du mécanisme de mise en cache de Glide

坏嘻嘻
坏嘻嘻original
2018-09-14 10:29:412957parcourir

Avant de commencer, nous devons mettre les fichiers xerces.jar et xalan.jar dans le répertoire java.class.path (ces deux fichiers sont inclus dans Xalan-Java 1.2 et peuvent être téléchargés depuis xml.apache.org) .

1. Introduction au cache Glide

2. Cache Key

EngineKey

Réécrit les méthodes equals() et hashCode() pour garantir Le même objet EngineKey est considéré comme identique uniquement si tous les paramètres transmis à EngineKey sont les mêmes

3. Cache mémoire

Glide.with(this)
     .load(url)
     .skipMemoryCache(true)
     .into(imageView);

Algorithme LruCache (le moins récemment). Utilisé)
Android charge efficacement les grandes images et les solutions multi-images, évitant efficacement le MOO du programme

Il est très facile de penser à l'algorithme LruCache (Least Récemment utilisé), également appelé le moins récemment algorithme utilisé. Son principe principal d'algorithme est de stocker les objets les plus récemment utilisés dans LinkedHashMap avec des références fortes et de supprimer les objets les moins récemment utilisés de la mémoire avant que la valeur du cache n'atteigne la valeur prédéfinie. L'utilisation de LruCache est également relativement simple
La méthode loadFromCache() est utilisée pour obtenir l'image mise en cache. Si elle est obtenue, la méthode cb.onResourceReady() est directement appelée pour le rappel. Si elle n'est pas obtenue, la méthode loadFromActiveResources() sera appelée à la ligne 26 pour obtenir l'image mise en cache. Si elle est obtenue, un rappel sera effectué directement. Ce n'est que lorsqu'aucune des méthodes n'obtient le cache que l'exécution se poursuivra vers le bas, ouvrant ainsi le thread pour charger l'image.

loadFromCache() et loadFromActiveResources(). L'une de ces deux méthodes utilise l'algorithme LruCache et l'autre utilise des références faibles.

Cache du disque dur

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

DiskCacheStrategy.NONE : Indique de ne rien mettre en cache.
DiskCacheStrategy.SOURCE : indique que seules les images originales sont mises en cache.
DiskCacheStrategy.RESULT : indique que seules les images converties seront mises en cache (option par défaut).
DiskCacheStrategy.ALL : indique que les images originales et les images converties sont mises en cache.

DiskLruCache
Android DiskLruCache est entièrement analysé et constitue la meilleure solution pour la mise en cache du disque dur

private Resource<?> decode() throws Exception {    if (isDecodingFromCache()) {        return decodeFromCache();
    } else {        return decodeFromSource();
    }
}

Ici, nous appellerons d'abord la méthode decodeResultFromCache() de DecodeJob pour obtenir le cache, s'il ne peut pas être obtenu, la méthode decodeSourceFromCache() sera à nouveau appelée pour obtenir le cache. La différence entre ces deux méthodes est en fait la différence entre les deux paramètres de DiskCacheStrategy.RESULT et DiskCacheStrategy.SOURCE, je crois. aucune autre explication n'est nécessaire de ma part.

Compétences avancées

Par exemple, un ami du groupe m'a déjà dit que les ressources d'images de leurs projets sont toutes stockées sur Qiniu Cloud, et afin de protéger ressources d'image, Qiniu Cloud ajoutera un paramètre de jeton à l'adresse URL de l'image. Autrement dit, l'adresse URL d'une image peut être au format suivant :
http://url.com/image.jpg?token=d9caa6e02c990b0a

public class MyGlideUrl extends GlideUrl {

    private String mUrl;    public MyGlideUrl(String url) {        super(url);
        mUrl = url;
    }    @Override
    public String getCacheKey() {        return mUrl.replace(findTokenParam(), "");
    }    private String findTokenParam() {
        String tokenParam = "";        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");        if (tokenKeyIndex != -1) {            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }        return tokenParam;
    }

}
Glide.with(this)
     .load(new MyGlideUrl(url))
     .into(imageView);

Recommandation connexe :

PHP implémente la classe DatainputStream en Java.

Méthode Java de connexion à mysql_MySQL


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn