这个需求来源是在一个图片的列表里。这个图片列表显示的是缩略图,然后点击图片要打开对应的大图模式。但是加载大图比较耗时,所以先显示缩略图,等大图加载下来的时候在替换缩略图。本来感觉这个需求没啥难度,就是在加载大图前加一步检测有没有缩略图,然后加载就行了。。但是,glide尽然没有提供一个简单的获取磁盘缓存的方法。。。。。
好吧,开始趟坑之路。
其实做之前想了下,图片加载的三级缓存这个感觉是基本的功能啊。所以获取磁盘缓存坑定是有的,可能glide是没有对外提供?但是他们坑定有的,所以网上找了个方法DiskUrlCacheWrapper里面的get方法可以获取到。然后当时测试也没问题,具体代码如下:
File file = DiskLruCacheWrapper.get(Glide.getPhotoCacheDir(mActivity), 250 * 1024 * 1024).get(new OriginalKey(url, EmptySignature.obtain()));
其中OriginalKey是自己写的代码如下:
private class OriginalKey implements Key {
private final String id;
private final Key signature;
private OriginalKey(String id, Key signature) {
this.id = id;
this.signature = signature;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
OriginalKey that = (OriginalKey) o;
return id.equals(that.id) && signature.equals(that.signature);
}
@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + signature.hashCode();
return result;
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
try {
messageDigest.update(id.getBytes(STRING_CHARSET_NAME));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
signature.updateDiskCacheKey(messageDigest);
}
}
做完后没问题还是比较happy的,然而,前几天一个同事过来说,你做的那个图片缓存功能在我那怎么没用啊?我:????
当时第一反应就是,这哥们做了啥奇葩操作?然后去看了下他使用的代码,glide使用没啥问题,也没禁用磁盘缓存,缓存策略也ok。但是,我记得我们统一封装了glide工具类了啊,你为啥自己写了一套了?而且,你为啥要使用load(file)的形式去做了?明明直接glide就可以支持本地路径形式的url啊。。。
好了吐槽完后,发现就是load(file)部分的图片在使用上面获取缓存的方式时候没找到,先去看看注释里面有没有解释,如下:
this method caches data for Files using only the file path itself as the cache key.
没问题啊,会将文件的路径作为key缓存进去,然后我看了下,给我传过来的就是文件的路径呀,为啥我获取不到?T.T 同事
那边也不好处理,只能我这边获取缓存的方式搞搞了。。这次感觉还是去glide的git上面找找吧。感觉这个问题是常用的啊。。然后,找到的方法如下:
class GetGlideCacheTask extends AsyncTask<String, Void, File> {
public GetGlideCacheTask() {
}
@Override
protected File doInBackground(String... params) {
String url = params[0]; // should be easy to extend to share multiple images at once
if (TextUtils.isEmpty(url)) {
return null;
}
try {
// Glide v3
return Glide
.with(mActivity)
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get() // needs to be called on background thread
;
} catch (Exception ex) {
Log.w("SHARE", "Sharing " + url + " failed", ex);
return null;
}
}
@Override
protected void onPostExecute(File result) {
if (result == null) {
return;
}
//使用文件
}
}
代码来源 这里可以查看方案来源
使用这个方式后就没啥问题了。希望出坑了吧。。。T0T