android - 离线时 Glide 不会从 Firebase 存储中获取最新照片

标签 android firebase firebase-storage android-glide

我正在使用 Glide 从 Firebase 存储中获取并显示照片。当设备在线时,一切都运行良好。

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

我不想使用 Glide 缓存照片。我只想从 Firebase 存储的离线缓存中检索缓存的照片。有没有可能的方法或解决方法来解决这个问题。

这是我的代码。

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不缓存图像(有关更多详细信息,请参阅 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");
            }
        });
    }
});

关于android - 离线时 Glide 不会从 Firebase 存储中获取最新照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49913433/

相关文章:

java - 无法检查单选按钮

android - Firebase 存储在下载过程中处理网络中断

python - 如何获取上传文件的url?

Android Firebase 库,仪器测试 - 无静态方法 registerDefaultInstance(Ljava/lang/Class;Lcom/google/protobuf/GeneratedMessageLite

swift - 如何从 Firebase 中获取图像并将其保存到 uitableViewCell 中的图像中?

android - 单击动画上的事件 ImageView 仅在开始位置触发

java - Fuel、Kotlin、Gson,预期为 BEGIN_ARRAY,但在第 1 行为 BEGIN_OBJECT

android - 直播到 YouTube - 自适应比特率?

android - Firebase Auth - GoogleAuthProvider 和 FacebookAuthProvider 正在取代 EmailAuthProvider

android - Firebase Facebook 登录哈希键问题