问题描述
@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代码,然后重新尝试加载图像。