Android Glide不会在本地缓存图像
我有以下代码:Android Glide不会在本地缓存图像,android,android-glide,Android,Android 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 *
@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, 0, 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) { }
});
}
@覆盖
BindViewHolder上的公共无效(@NonNull RecyclerView.ViewHolder h,int位置){
Product Product=productArrayList.get(位置);
视窗支架=(视窗支架)h;
最终长1兆字节=1024*1024;
FirebaseStorage.getInstance().getReference(“images/”+product.imageName).getBytes(1兆字节).addOnSuccessListener(新OnSuccessListener(){
@凌驾
成功时的公共void(字节[]字节){
位图位图=位图工厂.decodeByteArray(字节,0,字节.长度);
product.setBitmap(位图);
Glide.with(context).load(product.getBitmap()).diskCacheStrategy(diskCacheStrategy.ALL).into(holder.productImageView);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){}
});
}
而且它不会缓存图像。每次我重新运行应用程序时,它都会重新加载。在第一次运行之后,应该立即加载图像以供后续运行,但不,它只是不缓存图像。在这种情况下,您引用的是产品对象的位图,因此Glide无法知道您每次都在加载相同的图像。在这种情况下,Glide可以用来识别何时适合从缓存加载。例如,如果从URL(例如,作为字符串)而不是位图加载,并且URL每次都相同,则图像将从缓存加载,因为URL的hashCode()和equals()值一致。在您的情况下,最好确定产品对象的唯一属性,并将其用作加载时提供客户签名的唯一属性。因此,假设您的产品有一个
id
,可以用getId()
引用。然后
Glide.with(片段)
.load(product.getBitmap())
.signature(新的ObjectKey(product.getId()))
.into(holder.productImageView);
假设以前加载过具有相同ID的产品,那么Glide应该从缓存中提取图像
这里的一个进一步优化可能是在知道映像将来自缓存时调用FirebaseStorage.getInstance().getReference()
。要做到这一点,您可以尝试使用类似于上面的方法加载,但是设置一个侦听器,并在重新尝试加载图像之前依靠执行onLoadFailed()
来触发Firebase代码