Glide缓存汇总

Glide缓存汇总

1、Glide有内存缓存和磁盘缓存

2、缓存策略

3、内存缓存

4、磁盘缓存

5、缓存位置和大小

6、清理缓存

7、缓存动态url


1、Glide有内存缓存和磁盘缓存

缓存资源又分为原图(SOURCE)和经过压缩变形的处理图(RESULT)。

2、缓存策略

Glide的缓存读取顺序是 内存-->磁盘-->网络。

Glide缓存策略是——缓存图片时默认只缓存最终加载的那张图片(RESULT)。加载图片的默认格式为RGB_565。

当图片加载请求200×200时,则缓存一张200×200的缓存图片,如果再有同一张图片但要求是300×300的,Glide会重新下载并缓存一张300×300的缓存图片。

3、内存缓存

Glide默认是会在内存中缓存处理图(RESULT)的。

如果不想使用内存缓存(比如加载GIF图片),这个时候可以调用skipMemoryCache(true)方法跳过内存缓存。

使用内存缓存减少了耗时的IO操作,可以获得更快的图片加载速度。在Android的APP中,Bitmap是Android中的内存大户,频繁的创建和回收Bitmap必然会引起内存抖动。在Glide中有一个叫做BitmapPool的类,可以复用其中的Bitmap对象,从而避免Bitmap对象的创建,减小内存开销。当配置内存缓存时,我们也应该同时配置BitmapPool的大小。具体方法也是通过自定义的GlideModule来实现的:

builder.setMemoryCache(new LruResourceCache(yourSizeInBytes));
builder.setBitmapPool(new LruBitmapPool(sizeInBytes));

默认的内存缓存和bitmapPool的大小由MemorySizeCalculator根据当前设备的屏幕大小和可用内存计算得到。同时Glide还支持动态的缓存大小调整。可以通过setMemoryCategory方法来提高Glide的内存缓存大小,从而加快图片的加载速度。

Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);

MemoryCategory有3个值可供选择:
MemoryCategory.HIGH(初始缓存大小的1.5倍)
MemoryCategory.NORMAL(初始缓存大小的1倍)
MemoryCategory.LOW(初始缓存大小的0.5倍)

4、磁盘缓存

磁盘缓存策略分为四种,默认的是RESULT

DiskCacheStrategy.NONE 不缓存文件
DiskCacheStrategy.SOURCE 只缓存原图
DiskCacheStrategy.RESULT 只缓存最终加载的图(默认的缓存略)
DiskCacheStrategy.ALL 同时缓存原图和结果图

通过方法diskCacheStrategy(var)来设置磁盘缓存策略。

5、缓存位置和大小

通过构建一个自定义的GlideModule来配置Glide磁盘缓存的位置和大小。最简单的方法如下:

public class DiskCacheMoudle implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {

        builder.setDiskCache(
                new InternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));

        //builder.setDiskCache(
        //        new ExternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

其中InternalCache和ExternalCache都最多接收3个参数:第一个参数为Context,没啥好说的;第二个为缓存的目录名称;第三个为缓存大小,单位是Byte。它们之间唯一的不同就在于InternalCache构建的缓存是在应用的内部储存,而ExternalCache则是在外部储存。内部储存中的缓存文件是其他应用程序是无法获取到的,更加安全。

如果不想把缓存放在上面的两个位置怎么办?Glide当然也支持,具体通过DiskLruCacheFactory来实现:

builder.setDiskCache(
    new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
    @Override
    public File getCacheDirectory() {
        return getMyCacheLocationBlockingIO();
    }
}), 100 * 1024 * 1024);

Note: getMyCacheLocationBlockingIO方法返回的文件不能为空,而且必须是一个已经创建好的文件目录,不可以是文件。

内存缓存设置:
    //设置Glide内存缓存大小
    int maxMemory = (int) Runtime.getRuntime().maxMemory();//获取系统分配给应用的总内存大小
    int memoryCacheSize = maxMemory / 8;//设置图片内存缓存占用八分之一
    //设置内存缓存大小
    builder.setMemoryCache(new LruResourceCache(memoryCacheSize));

Glide配置例子

public class GlideConfiguration implements GlideModule {
    public static final int DISK_CACHE_SIZE = 1024 * 1024 * 600;//最多可以缓存多少字节的数据
    public static final String DISK_CACHE_NAME = "iflashbuy_glide";
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {

        //1.设置Glide内存缓存大小
        int maxMemory = (int) Runtime.getRuntime().maxMemory();//获取系统分配给应用的总内存大小
        int memoryCacheSize = maxMemory / 8;//设置图片内存缓存占用八分之一
        //设置内存缓存大小
        builder.setMemoryCache(new LruResourceCache(memoryCacheSize));

        // 2.设置Glide磁盘缓存大小
        File cacheDir = context.getExternalCacheDir();//指定的是数据的缓存地址
        int diskSize =  DISK_CACHE_SIZE;
        //设置磁盘缓存大小
        if(cacheDir != null){
            builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getPath(), DISK_CACHE_NAME, diskSize));
        }
        //builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, diskSize));

        //3.设置图片解码格式
        // builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
        builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);

        //4.设置BitmapPool缓存内存大小
        builder.setBitmapPool(new LruBitmapPool(memoryCacheSize));

        ViewTarget.setTagId(R.id.glidetag);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }
}

6、清理缓存:

清除所有内存缓存(需要在Ui线程操作)

Glide.get(this).clearMemory();

清除所有磁盘缓存(需要在子线程操作)

Glide.get(MainActivity.this).clearDiskCache();

注:在使用中的资源不会被清除

7、动态缓存URL

一般情况下我们从网络上获取到的图片Url都是静态的,即一张图片对应一个Url。那么如果是一张图片对应多个Url呢?缓存不就没有意义了。因为图片加载库都是拿图片的Url来作为缓存的key的,Glide也不例外,只是会更加复杂一些。如果你开启了Glide的log,就会在控制台看到Glide是如何指定缓存key的。关于如何打开log,请参考这篇文章(https://www.jianshu.com/p/9bd6efca8724)。一般来说,Glide的key由图片的url、view的宽和高、屏幕的尺寸大小和signature组成。

在什么情况下才会出现动态的Url呢?一个很典型的例子就是因为图片的安全问题在原来图片的Url后面加上访问凭证。访问凭证与时间关联,这样一来,在不同时间同一图片的Url就会不同,缓存就会失效。

以七牛的私有空间为例,我们来看看如何去缓存这类图片。从七牛关于私有空间的文档中可以得到:最终的Url = 原Url + ?e=过期时间 + token=下载凭证。那么就只需要在Glide缓存时将Url中“?”后面的字符串截去就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容