【问题标题】:How to cancel Firebase Storage Metadata download Task?如何取消 Firebase 存储元数据下载任务?
【发布时间】:2021-10-04 09:18:55
【问题描述】:

我间歇性地检查我的应用的 Firebase 存储中是否有新版本的文件。我用:

val task = ref.metadata
        task.addOnSuccessListener

检查元数据并将其与我现有的下载进行比较。我有一个泄漏问题,如果用户没有连接或连接不良,它会保持通话。没有办法取消请求。

如何删除失败的请求以防止内存泄漏?

【问题讨论】:

    标签: android firebase kotlin firebase-storage


    【解决方案1】:

    据我了解,您正在尝试检索与“ref”对象关联的元数据,如果发生更改,请再次下载文件。

    如果是这种情况,为了在用户没有网络连接或网络连接不好时能够取消下载操作,请尝试以下解决方案。

    当您使用以下方式获取更改后的文件时:

    val task = ref.getFile(destinationFile)
    

    请注意,在StorageReference 对象上调用的getFile(File destinationFile) 方法会返回FileDownloadTask 类型的对象。这个类是StorageTask的子类,从术语上讲是ControllableTask的子类,也是CancellableTask的子类。

    由于这三个类之间有继承关系,可以简单的调用CancellableTask的cancel()方法:

    尝试取消任务。

    为了取消任务。在代码中应该是这样的:

    task.cancel()
    

    由于 Kotlin 是一种静态类型的编程语言,其中变量类型在编译时确定,而不是在运行时确定,因此您可以在定义变量时使用 valvar,而不是对象的类型。这使得有时很难读取对象类型。因此,由于您不能像我们在 Java 早期版本中所做的那样声明上述变量:

    FileDownloadTask task = ref.getFile(destinationFile);
    

    声明上述对象的更易读的方法是:

    val fileDownloadTask = ref.getFile(destinationFile)
    

    并取消任务:

    fileDownloadTask.cancel()
    

    现在应该更容易理解了。

    编辑:

    适用于 Cloud Storage 的 Firebase Android SDK 不支持离线访问,因此存在这种行为。您可以在读取文件时取消()操作,或在上传文件时恢复操作,当用户没有互联网连接或互联网连接不良时,但在读取元数据时不能。

    我能想到的最佳选择是将文件的 URL 与一些重要的元数据一起保存到 Cloud FirestoreFirebase Realtime Database 中,并使用持久侦听器实时获取更新。

    【讨论】:

    • 嗨,亚历克斯,感谢您的回答!这对于文件下载任务来说是完美的,但是当通过 StorageRef .getMetadata() 方法获取元数据时,没有取消方法。我的问题是关于获取元数据而不是文件。
    • 是的,没错,获取元数据时没有cancel()方法。发生这种情况是因为 StorageReference 的 getMetadata() 返回一个 Task 对象,而您可以看到没有这样的方法。除此之外,Task 类仅扩展 Object 类,任何其他类。所以它不会继承类似的方法。所以无法取消元数据的读取操作。
    • 啊,好吧。这就是导致我内存泄漏的原因,因为它的调用不会因为不在线而返回错误,它只是维护任务。我添加了一个硬编码的“isInternetAvailable”检查,但对于泄漏可以维持较长时间的弱连接没有帮助。任何解决方法的想法?
    • 我看不到获取某些元数据可能会导致内存泄漏。但是,请检查我的更新答案。
    • 是的,我也在考虑将某些内容保存到数据库中。可以工作,但可能不太理想。我收到了来自泄漏金丝雀的内存泄漏的报告,明确归咎于 getMetadata()。我会进一步试验。
    猜你喜欢
    • 2016-10-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多