Glide缓存key的问题

最近项目里面有个地方是在前面用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;
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值