【问题标题】:Glide not fetching latest photo from firebase storage when offlineGlide 离线时不会从 Firebase 存储中获取最新照片
【发布时间】:2018-09-29 12:08:36
【问题描述】:

我正在使用 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)

【问题讨论】:

  • @NileshRathod 我是安卓新手。详细的解释会很有帮助:)
  • 你误解了这个问题。我的问题是如何在设备离线时从 firebase 存储缓存中检索照片,而不是通过 Glide 缓存照片。我已经更新了更多细节的问题。

标签: android firebase firebase-storage android-glide


【解决方案1】:

问题是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");
            }
        });
    }
});

【讨论】:

  • 你误解了这个问题。我的问题是如何在设备离线时从 firebase 存储缓存中检索照片,而不是通过 Glide 缓存照片。我已经更新了更多细节的问题。
  • @VivekRajendran 也许你并不清楚,但如果你将配置缓存,它们会在在线时检索和缓存照片,并且使用 glide 或 picasso,它们也将在离线时持久化和可用。
  • firebase 存储本身会缓存照片以供离线使用。这样我就不想再用 Glide 缓存它了。
  • @VivekRajendran 不,AFAIK,firebase 没有提供缓存图像的方法(也请参见此处:stackoverflow.com/questions/37699688/…)。这可以通过以下事实得到证实:如果图像是由 firebase 缓存的,那么在离线时也应该以相同的方式检索它们,但它们不是(你也用你的问题确认了)。
  • 如果是这样,我想知道如何在没有照片副本的情况下将照片上传到云端?
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
相关资源
最近更新 更多