如何缓存动态URL的图片

一般情况下我们从网络上获取到的图片Url都是静态的,即一张图片对应一个Url。那么如果是一张图片对应多个Url呢?缓存不就没有意义了。因为图片加载库都是拿图片的Url来作为缓存的key的,Glide也不例外,只是会更加复杂一些。如果你开启了Glide的log,就会在控制台看到Glide是如何指定缓存key的。一般来说,Glide的key由图片的url、view的宽和高、屏幕的尺寸大小和signature组成。
在什么情况下才会出现动态的Url呢?一个很典型的例子就是因为图片的安全问题在原来图片的Url后面加上访问凭证。访问凭证与时间关联,这样一来,在不同时间同一图片的Url就会不同,缓存就会失效。以七牛的私有空间为例,我们来看看如何去缓存这类图片。从七牛关于私有空间的文档中可以得到:最终的Url = 原Url + ?e=过期时间 + token=下载凭证。那么就只需要在Glide缓存时将Url中“?”后面的字符串截去就可以了。
首先新建一个叫做QiNiuImage的类:
publicclassQiNiuImage{privatefinalString imageUrl;publicQiNiuImage(String imageUrl){this.imageUrl= imageUrl;}publicString getImageUrl(){return imageUrl;}publicString getImageId(){if(imageUrl.contains("?")){return imageUrl.substring(0, imageUrl.lastIndexOf("?"));}else{return imageUrl;}}}
其中getImageUrl方法返回真实的Url,getImageId方法返回未添加下载凭证前的Url。
然后再自定义一个实现ModelLoader接口的QiNiuImageLoader:
publicclassQiNiuImageLoaderimplementsStreamModelLoader