失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 从Glide获取磁盘缓存

从Glide获取磁盘缓存

时间:2019-09-13 20:15:04

相关推荐

从Glide获取磁盘缓存

这个需求来源是在一个图片的列表里。这个图片列表显示的是缩略图,然后点击图片要打开对应的大图模式。但是加载大图比较耗时,所以先显示缩略图,等大图加载下来的时候在替换缩略图。本来感觉这个需求没啥难度,就是在加载大图前加一步检测有没有缩略图,然后加载就行了。。但是,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

如果觉得《从Glide获取磁盘缓存》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。