代码之家  ›  专栏  ›  技术社区  ›  VivekRajendran

脱机时Glide无法从firebase存储中获取最新照片

  •  2
  • VivekRajendran  · 技术社区  · 6 年前

    我正在使用Glide从Firebase存储中获取和显示照片。当设备处于联机状态时,一切正常。

    当用户更新配置文件图片(firebase存储引用更改)时,Glide无法从firebase存储的脱机缓存中获取照片。

    我不想使用Glide缓存照片。我只是想 retrieve the cached photo from Firebase storage's offline cache .是否有任何可能的方法或解决方法来解决此问题。

    这是我的密码。

    滑动模块

    @GlideModule
    class MyGlideModule : AppGlideModule() {
    
        override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
            registry.append(StorageReference::class.java, InputStream::class.java,
                FirebaseImageLoader.Factory())
        }
    }
    

    从firebase存储中获取配置文件图片的代码

    GlideApp.with(profileIcon.context)
                    .load(customerPictureReference)
                    .centerCrop()
                    .placeholder(R.drawable.ic_profile_placeholder)
                    .into(profileIcon)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   dan    6 年前

    问题是 Firebase 未缓存图像(请参阅 here 了解更多详细信息)。

    您应该能够配置 Glide 要在本地缓存图像,请执行以下操作(请参见 here 更多):

    @GlideModule
    public class GiphyGlideModule extends AppGlideModule {
      @Override
      public void applyOptions(Context context, GlideBuilder builder) {
        builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024));
      }
    
      @Override
      public void registerComponents(Context context, Glide glide, Registry registry) {
        registry.append(Api.GifResult.class, InputStream.class, new GiphyModelLoader.Factory());
      }
    }
    

    那么您只需添加: .diskCacheStrategy(DiskCacheStrategy.ALL) 听你的电话。类似于:

    GlideApp.with(profileIcon.context)
                    .load(customerPictureReference)
                    .diskCacheStrategy(DiskCacheStrategy.ALL) 
                    .centerCrop()
                    .placeholder(R.drawable.ic_profile_placeholder)
                    .into(profileIcon) 
    

    您可以使用的另一个选项是 Picasso 这也将缓存图像。

    要首先从本地缓存中检索图像,如果无法联机尝试,可以使用以下方法:

    Picasso.with(getActivity())
    .load(imageUrl)
    .networkPolicy(NetworkPolicy.OFFLINE)
    .into(imageView, new Callback() {
        @Override
        public void onSuccess() {
          //..image loaded from cache
        }
    
        @Override
        public void onError() {
            //Try again online if cache failed
            Picasso.with(getActivity())
                    .load(posts.get(position).getImageUrl())
                    .error(R.drawable.header)
                    .into(imageView, new Callback() {
                @Override
                public void onSuccess() {
                  //... image loaded from online
                }
    
                @Override
                public void onError() {
                    Log.v("Picasso","Could not fetch image");
                }
            });
        }
    });