最近项目里面有个地方是在前面用glide加载图片后,后面再另外一个地方加载相同图片时没有复用glide的缓存,而是自己另外又重新缓存了一套。
查找后发现问题是glide缓存的key不一致的问题。
从key的生成可以看到和很多参数有关,逐一排查后,发现了width和height还有id不一样。
下面直接上代码,解决方案:(代码的相互调用关系)
File file = new File(ImageManager.getUrlPicLocalPath(this, "网络图片url")); if(file.exists()) { // 加载缓存的图片,自己处理 loading(); }else { preloadImage(this, mAdvertiseInfo.getImage_url()); }
private void loading() { //加载图片 ImageManager.loadImage(LauncherActivity.this, "网络图片url", ImageView, new ImageCallBack() { @Override public void onImageSuccess(Bitmap bitmap) { //图片加载成功 } }, DiskCacheStrategy.RESOURCE); }
ImageManager类:中的方法
public static void loadImage(Context context, String url, final ImageView imageView, final ImageCallBack callBack, DiskCacheStrategy strategey) { if (isDestroyed(context)) return; CustomViewTarget target = new CustomViewTarget<View, Bitmap>(imageView) { @Override protected void onResourceCleared(@Nullable Drawable placeholder) { } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { } @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { imageView.setImageBitmap(resource); if (callBack != null) { callBack.onImageSuccess(resource); } } }; Glide.with(context).asBitmap().load(url).diskCacheStrategy(strategey).into(target); }
public static String getUrlPicLocalPath(Context context, String url) { String path = null; if (BuildConfig.GLIDE_VERSION.compareTo("4.0.0") >= 0) { return context.getCacheDir() + "/image_manager_disk_cache/" + getGlide4_SafeKey(url); } else if (BuildConfig.GLIDE_VERSION.compareTo("3.0.0") >= 0) { return context.getCacheDir() + "/image_manager_disk_cache/" + getGlide3_SafeKey(url, Envi.screenWidth, Envi.screenHeight); } return path; }
public static String getUrlPicLocalPath(Context context, String url) { String path = null; if (BuildConfig.GLIDE_VERSION.compareTo("4.0.0") >= 0) { return context.getCacheDir() + "/image_manager_disk_cache/" + getGlide4_SafeKey(url); } else if (BuildConfig.GLIDE_VERSION.compareTo("3.0.0") >= 0) { return context.getCacheDir() + "/image_manager_disk_cache/" + getGlide3_SafeKey(url, Envi.screenWidth, Envi.screenHeight); } return path; }
// 这是获取key的关键
private static String getGlide3_SafeKey(String url, int width, int height) { byte[] dimensions = ByteBuffer.allocate(8) .putInt(width) .putInt(height) .array(); try { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); EmptySignature signature = EmptySignature.obtain(); signature.updateDiskCacheKey(messageDigest); messageDigest.update(url.getBytes(STRING_CHARSET_NAME)); messageDigest.update(dimensions); messageDigest.update("".getBytes(STRING_CHARSET_NAME)); messageDigest.update("ImageVideoBitmapDecoder.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME)); messageDigest.update("FitCenter.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME)); messageDigest.update("BitmapEncoder.com.bumptech.glide.load.resource.bitmap".getBytes(STRING_CHARSET_NAME)); messageDigest.update("".getBytes(STRING_CHARSET_NAME)); String safeKey = Util.sha256BytesToHex(messageDigest.digest()); return safeKey + ".0"; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
// 这是获取key的关键
private static String getGlide4_SafeKey(Context context, String url) {
try {
BaseRequestOptions baseRequestOptions = Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.RESOURCE);
Options options = baseRequestOptions.getOptions();
Class<?> resouceClass = android.graphics.Bitmap.class;
byte[] result = resouceClass.getName().getBytes("UTF-8");
Transformation<?> transition = (Transformation<?>)baseRequestOptions.getTransformations().get(resouceClass);
ArrayPool arrayPool = new LruArrayPool(new MemorySizeCalculator.Builder(context).build().getArrayPoolSizeInBytes());
byte[] dimensions = arrayPool.getExact(8, byte[].class);
ByteBuffer.wrap(dimensions).putInt(Integer.MIN_VALUE).putInt(Integer.MIN_VALUE).array();
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
EmptySignature signature = EmptySignature.obtain();
signature.updateDiskCacheKey(messageDigest);
GlideUrl glideUrl = new GlideUrl(url);
glideUrl.updateDiskCacheKey(messageDigest);
messageDigest.update(dimensions);
if (transition != null) {
transition.updateDiskCacheKey(messageDigest);
}
options.updateDiskCacheKey(messageDigest);
messageDigest.update(result);
String safeKey = Util.sha256BytesToHex(messageDigest.digest());
return safeKey + ".0";
} catch (Exception e) {
}
return null;
}