【问题标题】:How to load firebase storage image to fresco without losing cache functionality?如何在不丢失缓存功能的情况下将 Firebase 存储图像加载到壁画?
【发布时间】:2020-08-19 06:40:52
【问题描述】:

这就是我下载图片网址的方式

StorageReference gsReference = FirebaseStorage.getInstance().getReference();

gsReference.child(<image_path>).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // use fresco to load images
    }
});

然后我像这样使用 Fresco:

StorageReference gsReference = FirebaseStorage.getInstance().getReference();

gsReference.child(<image_path>).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        ImageRequest request1 = ImageRequestBuilder.newBuilderWithSource(Uri.parse(uri))
                .setProgressiveRenderingEnabled(true)
                .build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request1)
                .setControllerListener(this)
                .setOldController(imageView.getController())
                .build();

        imageView.setController(controller);
    }
});

当用户离线时,我失去了 Fresco 缓存功能,因为我必须下载图像 url 才能在 fresco 中使用。所以图片网址永远不会加载。

如何从 fresco 的缓存中获取图片,这样即使离线也可以加载图片而无法检索下载网址?

【问题讨论】:

  • 我不确定我是否理解这个问题。如果用户处于离线状态,您还希望从这段不起作用的代码中得到什么?
  • @FrankvanPuffelen 当用户离线时,我仍然想获取存储在 Fresco 缓存中的图像。
  • 谢谢!您共享的代码中的哪一部分现在没有朝着这个方向努力?
  • @FrankvanPuffelen 代码中的每一件事都有效。我只是不知道如何在没有互联网连接的情况下在 Fresco 中获取缓存的图像,因为图像 url 是从 firebase 存储 api 获取的。为了获取缓存图像,我们需要将图像 uri 传递给 Fresco api。

标签: android firebase firebase-storage fresco


【解决方案1】:

确定路径中图片的下载 URL 需要连接到 Google 服务器。设备离线时无法拨打getDownloadURL()

但由于下载 URL 完全基于您的 &lt;image_path&gt;,您可以维护 &lt;image_path&gt; 的本地地图以下载 URL 并在设备离线时使用它。然后使用生成的下载 URL,您可以从缓存中加载图像。

事实上,我知道的大多数应用都将下载 URL 存储在 Firebase 的数据库之一(实时数据库或 Cloud Firestore)中。由于它们都在离线时继续提供数据,因此这些应用可以已经可以在离线时继续使用下载 URL。

【讨论】:

  • 感谢您的回复!维护我自己的 downloadURL 注册表对我的用例来说是一项艰巨的任务。您是否探索过使用 Glide 获取 Firebase 存储图像? Firebase 文档建议这样做。 firebase.google.com/docs/storage/android/…
  • 这里的问题不在于缓存图像数据本身,而在于您需要从服务器获取下载 URL。如果您不维护自己的下载 URL 列表,则获取它的唯一方法是调用服务器。由于您也不想这样做,因此您必须选择:您的应用在离线时无法运行,或者您必须编写一些代码来存储/缓存下载 URL。跨度>
【解决方案2】:

不要打电话给getDownloadUrl,这是另一个无用的电话,算作延迟。毕竟,当您可以直接调用 Firebase 函数时,您不需要可公开访问的 URL。

宁可创建您自己的ContentProvider,并使用指向您的提供商的content:// uri 提供壁画。 在 ContentProvider 中,您使用 fireStorage.getReference(path).getStream() 提供来自 Firebase 存储的数据流,并将其复制到 openFile 方法中的文件描述符中。如何在ContentProvider.openFile 中进行流复制肯定会在其他问题上得到解答。

经过测试,Fresco 缓存可以正常工作,并且不会再次加载已经缓存的图像。它也可以离线工作,并且不需要另一个数据库来记住 URL。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多