因为对Glide缓存这块平素未曾怎么关注过

修改不了signature如何做

看完wiki文档精晓了signature后我觉着自己的难题化解了,可是又有一个很难堪的题材就是服务器并从未下发能同日而语signature的多寡,事实上我能得到的唯有一个url而已,除此之外没有其他数据可以标示服务器上的图形资源是不是暴发了改变.那种场所能咋办呢,难道只好跳过内存和硬盘缓存么??
不得不继续在google上搜索解决方案,幸运地是找到了两位开发者关于那几个题材的一段对话.
https://github.com/bumptech/glide/issues/
此间不再举行讲了,简单记录下他们七个对话的要点:

  • 可以通过头阵两遍head请求来判定服务器上的资源是还是不是发生了转移,然后再经过Get请求来下载资源,不过这种措施需求发送四回网络请求,响应速度要慢一些.
  • 可以通过强制刷新空url的办法来重置当前内存数据和硬盘数据(卓越不美观)
  • 轮换并安装Glide使用的OkHttpClient,在拦截器里判断 header里的
    Etag或者modify提姆eStamp,当然前提是下发图片的服务器回传的response里有安顿那七个header字段(很不幸,服务器没布署那多个字段)

}

怎么着行使signature

贴一个Signature的最简便易行完毕:StringSignature

package com.bumptech.glide.signature;

import com.bumptech.glide.load.Key;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;

/**
 * A unique Signature that wraps a String.
 */
public class StringSignature implements Key {
    private final String signature;

    public StringSignature(String signature) {
        if (signature == null) {
            throw new NullPointerException("Signature cannot be null!");
        }
        this.signature = signature;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        StringSignature that = (StringSignature) o;

        return signature.equals(that.signature);
    }

    @Override
    public int hashCode() {
        return signature.hashCode();
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) throws UnsupportedEncodingException {
        messageDigest.update(signature.getBytes(STRING_CHARSET_NAME));
    }

    @Override
    public String toString() {
        return "StringSignature{"
            + "signature='" + signature + '\''
            + '}';
    }
}

可以寓目完成了 KEY接口的 Signature 对象涵盖一个
updateDiskCacheKey()方式用来更新Key:
经过SHA-256等算法来根据用户输入的signature来生成一个加密过的key
诸如此类也就能领会其余诸如
MediaStoreSignature等等种种Signature类,它们只是输入的被加密对象类型分裂而已.


您还是能定义你自己的签约,只要完结 Key 接口就好。请保管正确地落实equals(), hashCode() 和 updateDiskCacheKey() 方法:

题材讲述

-   [触发条件](https://www.jianshu.com/p/ee36e50a7426)

.diskCacheStrategy(DiskCacheStrategy.ALL)

Glide的缓存刷新机制

文档中表明如下:
硬盘缓存文件的key值都是哈希处理过的,并且在加载图片进度发生的缩略图等公事也都是以哈希值命名的,所以很难简单地根据代码中提供的原始图片路径(url,filePath等)来解除所有的连带缓存,所以官方提议的特级艺术是,假如想翻新硬盘缓存,就要履新上述提供的八个key值组成项中的一项.
那么难点来了,url和文件路径很有可能不会转移(比如我这一次遇到的题材),图片的宽高一般景况下也不会修改,那么唯有因而修改signature这么些值来达到修改key值的目的了.


.into(yourImageView);

总结

终极照旧用了
跳过内存和硬盘缓存的法子来解决了那个题材,由于难点事关的业务范围并不大,也从不做轮询等操作,所以那种解决方案固然不算完美,但归纳来说是最露骨和熏陶不大的方案,后续会和服务端的同事联系看有没有更好的缓解方案.

.load(url)

查看Glide缓存模块的wiki

因为对Glide缓存那块一贯没有怎么关注过,所以随后去看了下Glide关于缓存的wiki.

            return currentVersion = other.currentVersion;


在 Glide v4 里,所有缓存键都饱含至少四个因素:

硬盘缓存key如何整合
  • DateFetcher.getId() 方法重回的字符串,一般是URL或者文件路径.
  • override(int,int) 方法传入的图样宽高值(如若调用了),默许为
    Target.getSize() 方法再次回到的宽高值.
  • 每一趟加载图片时一个可选的签名字段.

前两项都很好明白,那么这一个signature签名字段是哪些意思,那要牵涉到glide的缓存刷新机制.


.load(yourFileDataModel)

焚林而猎思路

-   [查看glide缓存模块的wiki](https://www.jianshu.com/p/ee36e50a7426)
-   [signature是什么](https://www.jianshu.com/p/ee36e50a7426)
-   [修改不了signature怎么办](https://www.jianshu.com/p/ee36e50a7426)

举手投足资源和内存缓存使用的键还和磁盘资源缓存略有不相同,以适应内存
选项(Options),比如影响 Bitmap 配置的选项或任何解码时才会用到的参数。

总结


Url – 即便最好的让 url 失效的情势是让 server
保障在情节变更时对URL做出改变,你还可以使用 ObjectKey
来混入任意数据(比如版本号)。

序言

实现

难点讲述

那应当是一个采用Glide的经典难题了:
要是服务器上的某个资源对应的URL保持不变,那么使用Glide下载该资源(比如图片)的时候,会招致使用内存或flash上的多少来作为本次请求的结果,造成图片不能与服务器上的流行资源保险一致.


   

序言

发现这几个标题来自17年最后一天的一个线上事故,今儿晚上八点多的时候后端哥们儿打电话给我,询问怎么app的直播模块的截图不可能实时更新.我马上打开统计机,debug那段代码,打断点发现程序逻辑没有错误,图片链接放在浏览器中也是能实时更新的,最终发现直播截图的url始终未曾暴发改变,但其实服务器上的资源内容已经转移了,这么些bug也就改为了自己18年拍卖的首先个难题,依旧很有怀想意义的.


.load(url)

接触条件

  • 图片对应的URL始终未变更
  • 布局glide的时候没有禁用内存和硬盘缓存
  • 保持app进程不被杀掉

    }

竭泽而渔思路


文件 – 你可以行使 ObjectKey 来混入文件的修改日期。

    @Override

外加添加的其余 选项(Options)

GlideApp.with(yourFragment)

只要你只是想翻新缓存中的某个条目,请继续读书上面关于 invalidation
一节的介绍。

    public IntegerVersionSignature(int currentVersion) {

或多或少情况下,你也许希望假使图片不在缓存中则加载直接败北(比如省流量格局?–译者注)。即使要达成这几个目的,你可以在单个请求的根基上应用
onlyRetrieveFromCache 方法:

   

一旦你想确保一个特定的央浼跳过磁盘和/或内存缓存(比如,图片验证码
–译者注),Glide 也提供了有的替代方案。

要在你使用的特定部分临时允许 Glide 使用更多或更少的内存,你可以运用
setMemoryCategory:

仅从缓存加载图片

        return false;

数量来源 (Data) – 构建那几个图片的资源是还是不是之前曾被写入过文件缓存?

.skipMemoryCache(true)

默许情状下 Glide 的内存缓存和 BitmapPool 会响应 ComponentCallback2
,并按照 Android framework 提供的级别自动清理内容。
因而你日常不须要尝试动态监视或理清你的缓存或
BitmapPool。然则,假诺要求的话,Glide 确实提供了多少个手动选项。

Glide.get(applicationContext).clearDiskCache();

    }

GlideApp.with(fragment)

    @Override

前两步检查图片是或不是在内存中,若是是则直接再次来到图片。后两步则检查图片是或不是在磁盘上,以便快速但异步地重回图片。

可选的更换(Transformation)

.load(url)

DiskCacheStrategy 可被 diskCacheStrategy 方法应用到每一个单独的伏乞。
方今支撑的策略允许你阻止加载进程使用或写入磁盘缓存,拔取性地仅缓存无修改的原生数据,或仅缓存变换过的缩略图,或是兼而有之。

默许情形下,Glide 会在开始一个新的图样请求往日检查以下多级的缓存:

.diskCacheStrategy(DiskCacheStrategy.NONE)

将签署传入加载请求很简单:

.load(url)

.into(imageView);

}

    public boolean equals(Object o) {

.into(view);

一个可选的 签名(Signature)

磁盘缓存策略(Disk Cache Strategy)

.signature(new MediaStoreSignature(mimeType, dateModified, orientation))

安插缓存

暂时尺寸调整

        }

永久尺寸修改

定制缓存刷新策略

public class IntegerVersionSignature implements Key {

   

GlideApp.with(fragment)

请牢记,更大的内存缓存、位图池和磁盘缓存寻常能提供更好的属性,或者至少在平等级别。若是你改变了缓存的大小,
你应有小心地测量一下你改变以前和之后的特性相比,以保障您的改动带来的性解蔽是可以接受的。

内存缓存

尽管放置的选项不满意你的必要,你也可以编制你自己的 DiskCache
落成。请查看 配置 页得到愈来愈多音信。

        this.currentVersion = currentVersion;

除此以外,步骤1-3(活动资源,内存缓存,资源磁盘缓存)的缓存键还含有部分别样数据,包含:

return null;

那多个选拔可以同时利用:

GlideApp.with(fragment)

    private int currentVersion;

伸手的数据类型 (Bitmap, GIF, 或其它)

因为普通改变标识符比较坚苦仍然根本不能,所以Glide也提供了 签名 API
来勾兑(你可以操纵的)额外数据到你的缓存键中。签名(signature)适用于媒体内容,也适用于您可以自行维护的一对版本元数据。

    public int hashCode() {

Glide.get(context).clearMemory();

.into(imageView);

.diskCacheStrategy(DiskCacheStrategy.NONE)

在实践中,使缓存文件无效的一流方式是在情节暴发变化时(url,uri,文件路径等)更改你的标识符。

跳过缓存

仅跳过磁盘缓存,请使用 DiskCacheStrategy.NONE :

默许的国策叫做 AUTOMATIC
,它会尝试对本土和长途图片应用最佳的政策。当你加载远程数据(比如,从URL下载)时,AUTOMATIC
策略仅会储存未被你的加载进度修改过(比如,变换,裁剪–译者注)的本来面目数据,因为下载远程数据相比调整磁盘上曾经存在的数目要昂贵得多。对于本地数据,AUTOMATIC
策略则会仅存储变换过的缩略图,因为固然你需求再行转移另一个尺寸或项目标图片,取回原始数据也很简单。

传媒存储签名对于 MediaStore 数据以来也很间接:

.into(view);

即使如此提供了那么些办法让你跳过缓存,但您平日应该不会想这么做。从缓存中加载一个图形,要比拉取-解码-转换成一张新图片的总体流程快得多。

Glide4 缓存

GlideApp.with(fragment)

请牢记,为了幸免下跌品质,您将索要在后台批量加载任何版本元数据,以便在要加载图像时即已处在可用状态。

仅跳过内存缓存,请使用 skipMemoryCache() :

            IntegerVersionSignature other = (IntegerVersionSignature) o;

一旦这一个极力都爱莫能助生效,您不可能更改标识符,也不可能跟踪任何合理的版本元数据的意况下,也得以应用
diskCacheStrategy() 和 DiskCacheStrategy.NONE 来完全禁用磁盘缓存。

new AsyncTask<Void, Void, Void> {

        if (o instanceof IntegerVersionSignature) {

    @Override

    public void updateDiskCacheKey(MessageDigest md) {

.onlyRetrieveFromCache(true)

.load(mediaStoreUri)

资源管理

磁盘缓存

宽窄和冲天

指定 DiskCacheStrategy 卓殊简单:

}

万一图片在内存缓存或在磁盘缓存中,它会被显示出来。否则即使那些选项被安装为
true ,这一次加载会视同战败。

资源类型(Resource) – 该图片是不是之前曾被解码、转换并写入过磁盘缓存?

.into(view);

// This method must be called on a background thread.

要改成您拔取中 Glide 的可用 RAM 大小,请查看 配置。

清理所有内存并非专门经济,并且应该尽量避免,以幸免出现抖动和充实加载时间。

    }

.into(view);

Glide 的磁盘和内存缓存都是 LRU
,这意味在达到使用限制或持续接近限制值以前,它们将占用持续增多的内存或磁盘空间。为了伸张额外的八面见光,Glide
提供了一部分附加的法子来让你可以管理你的采纳使用的资源。

Glide 在运转时仅提供对磁盘缓存的一定量控制,可是其尺寸和布署可以在
AppGlideModule 中改变。

永久尺寸调整

.skipMemoryCache(true)

内存缓存 (Memory cache) – 该图片是或不是近日被加载过并仍存在于内存中?

protected Void doInBackground(Void… params) {

因为磁盘缓存使用的是哈希键,所以并从未一个相比好的不二法门来简单地删除某个特定url或文件路径对应的兼具缓存文件。假如您只同意加载或缓存原始图片的话,难点或许会变得更简约,但因为Glide还会缓存缩略图和提供三种转换(transformation),它们中的任何一个都会造成在缓存中创立一个新的文件,而要跟踪和删除一个图片的富有版本无疑是劳累的。

        return currentVersion;

@Override

.load(url)

为了扭转磁盘缓存上的缓存键名称,以上的每个元素会被哈希化以创制一个单身的字符串键名,并在随之作为磁盘缓存上的文书名使用。

GlideApp.with(fragment)

要转移你利用中 Glide 可用的 sdcard 可用空间,请查看 配置。

    }

缓存的刷新

缓存键(Cache Keys)

MediaStore 内容 – 对于媒体存储内容,你可以运用Glide的
MediaStoreSignature 类作为你的签名。MediaStoreSignature
允许你混入修改时间、MIME类型,以及item的倾向到缓存键中。那多少个属质量够可信赖地破获对图片的编制和更新,那足以允许你缓存媒体存储的缩略图。

清理磁盘缓存

// This method must be called on the main thread.

呼吁加载的 model(File, Url, Url)

       
messageDigest.update(ByteBuffer.allocate(Integer.SIZE).putInt(signature).array());

Glide 提供一序列的选项,以允许你挑选加载请求与 Glide 缓存怎么着相互。

GlideApp.with(fragment)

   

要尝尝清理所有磁盘缓存条目,你可以动用 clearDiskCache。

若是几个步骤都不许找到图片,则Glide会重临到原有资源以收复数据(原始文本,Uri,
Url等)。

.signature(new ObjectKey(yourVersionMetadata))

运动资源 (Active Resources) – 现在是或不是有另一个 View 正在体现那张图纸?