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

时间:2018-04-19 05:35:06

标签: android firebase firebase-storage android-glide

我正在使用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 个答案:

答案 0 :(得分:2)

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