Android下如何通过Glide的Signature配置实现图片缓存6周过期
Glide 6周缓存过期的签名计算公式
核心逻辑说明
你之前10分钟缓存的实现逻辑是成立的:通过将当前毫秒级时间戳除以缓存周期对应的总毫秒数,得到的整数结果会在整个缓存周期内保持不变,一旦超过缓存周期数值就会+1,触发Glide的signature变化,自动废弃旧缓存拉取新资源。
6周缓存对应的计算公式
3628800秒对应的总毫秒数为 1000 * 3628800,对应的计算代码有两种等价写法,第二种按时间单位拆分可读性更高:
val currentTime = System.currentTimeMillis() // 写法1:直接用秒数换算 val expiryFor6Weeks = currentTime / (1000 * 3628800) // 写法2:按时间单位拆分:1000毫秒/秒 * 60秒/分 * 60分/小时 * 24小时/天 *7天/周 *6周 // val expiryFor6Weeks = currentTime / (1000 * 60 * 60 * 24 * 7 * 6)
完整替换后的Glide加载代码
long currentTime = System.currentTimeMillis(); long ExpiryFor6Weeks = currentTime / (1000 * 3628800); Glide.with(getActivity()) .load(mUser.getCoverPhoto()) .error(R.drawable.bg_1) .signature(new StringSignature(String.valueOf(ExpiryFor6Weeks))) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { mTextBioOther.setVisibility(!isMe ? View.VISIBLE : View.GONE); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { mTextBioOther.setVisibility(!isMe ? View.VISIBLE : View.GONE); return false; } }) .into(mImageCover);
注意说明
这里建议将数值转为String传入StringSignature,避免int类型溢出问题:当前时间戳除以6周毫秒数得到的结果增长速度极慢,约49710年才会达到int最大值(2^31-1),常规业务场景下完全不需要担心溢出,转String只是更稳妥的通用写法。
内容的提问来源于stack exchange,提问作者CavinAndro
相关产品推荐
相关产品推荐

