Glide不会在本地缓存图像

问题描述

我有以下代码

   @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder h,int position) {
        Product product = productArrayList.get(position);
        ViewHolder holder = (ViewHolder)h;


        final long ONE_MEGABYTE = 1024 * 1024;
        FirebaseStorage.getInstance().getReference("images/"+product.imageName).getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
            @Override
            public void onSuccess(byte[] bytes) {
                Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,bytes.length);
                product.setBitmap(bitmap);
                Glide.with(context).load(product.getBitmap()).diskCacheStrategy(diskCacheStrategy.ALL).into(holder.productimageView);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) { }
        });

}

,并且不缓存图像。每当我重新运行应用程序时,它都会重新加载。对于第一个之后的后续运行,应该立即加载该图像,但是不,它只是不缓存图像。

解决方法

在这种情况下,您引用的是Product对象的位图,因此Glide无法得知您每次都加载相同的图像。在这种情况下,Glide可以使用cache keys来确定何时从缓存中加载。例如,如果您是从URL(例如,作为字符串)而不是从位图加载的,并且每次URL都相同,则将从缓存加载图像,因为URL的hashCode()具有一致的值)和equals()。对于您而言,最好确定Product对象的唯一属性,并将其用作ObjectKey,以便在加载时提供客户签名。因此,假设您的产品具有id可以引用的getId()。然后...

Glide.with(fragment)
  .load(product.getBitmap())
  .signature(new ObjectKey(product.getId()))
  .into(holder.productImageView);

假设之前已加载具有相同ID的产品,则Glide应该从缓存中提取图像。

这里的另一种优化可能是当您知道图像将来自缓存时调用FirebaseStorage.getInstance().getReference()。为此,您可以尝试使用与上述类似的方法进行加载,但是设置监听器并依靠onLoadFailed()的执行来触发Firebase代码,然后重新尝试加载图像。