• 技术文章 >类库下载 >java类库

    深入探究Glide的缓存机制

    坏嘻嘻坏嘻嘻2018-09-14 10:29:41原创2059
    开始之前,我们需要将xerces.jar 和 xalan.jar文件放入java.class.path目录下(这两个文件包含在Xalan-Java 1.2 中,可以从xml.apache.org处下载)。

    1.Glide缓存简介

    2.缓存Key

    EngineKey

    重写了equals()和hashCode()方法,保证只有传入EngineKey的所有参数都相同的情况下才认为是同一个EngineKey对象

    3.内存缓存

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

    LruCache算法(Least Recently Used)
    Android高效加载大图、多图解决方案,有效避免程序OOM

    非常容易就让人想到LruCache算法(Least Recently Used),也叫近期最少使用算法。它的主要算法原理就是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。LruCache的用法也比较简单
    loadFromCache()方法来获取缓存图片,如果获取到就直接调用cb.onResourceReady()方法进行回调。如果没有获取到,则会在第26行调用loadFromActiveResources()方法来获取缓存图片,获取到的话也直接进行回调。只有在两个方法都没有获取到缓存的情况下,才会继续向下执行,从而开启线程来加载图片。

    loadFromCache()和loadFromActiveResources()。这两个方法中一个使用的就是LruCache算法,另一个使用的就是弱引用。

    硬盘缓存

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

    DiskCacheStrategy.NONE: 表示不缓存任何内容。
    DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
    DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
    DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

    DiskLruCache
    Android DiskLruCache完全解析,硬盘缓存的最佳方案

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

    这里会先去调用DecodeJob的decodeResultFromCache()方法来获取缓存,如果获取不到,会再调用decodeSourceFromCache()方法获取缓存,这两个方法的区别其实就是DiskCacheStrategy.RESULT和DiskCacheStrategy.SOURCE这两个参数的区别,相信不需要我再做什么解释吧。

    高级技巧

    比如之前有一位群里的朋友就跟我说过,他们项目的图片资源都是存放在七牛云上面的,而七牛云为了对图片资源进行保护,会在图片url地址的基础之上再加上一个token参数。也就是说,一张图片的url地址可能会是如下格式:
    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);

    相关推荐:

    PHP实现java中的DatainputStream类.

    Java连接mysql的方法_MySQL

    以上就是深入探究Glide的缓存机制的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Glide,java
    上一篇:JAVA IO 以及 NIO 理解 下一篇:超实用的java基础教程有哪些?J2EE的13个规范详解
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• TimergliderJS 一个基于jQuery的时间轴插件_jquery• JS创建优美的页面滑动块效果 - Glider.js_javascript技巧
    1/1

    PHP中文网