Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Glide不会在本地缓存图像_Android_Android Glide - Fatal编程技术网

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代码