Glide 离线时不从 firebase 存储中获取最新照片

Glide not fetching latest photo from firebase storage when offline

我正在使用 Glide 从 Firebase 存储中获取和显示照片。设备在线时一切正常。

当用户更新个人资料图片(firebase 存储引用更改)时,Glide 无法从 Firebase 存储的离线缓存中获取照片。

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

这是我的代码。

Glide Module

@GlideModule
class MyGlideModule : AppGlideModule() {

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

Code to fetch profile picture from firebase storage

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

问题是Firebase is not caching images (see here了解更多详情)。

你应该可以配置 Glide to cache the images locally, with something like (see 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");
            }
        });
    }
});