如何取消 Firebase 存储元数据下载任务?

How to cancel Firebase Storage Metadata download Task?

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

val task = ref.metadata
        task.addOnSuccessListener

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

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

根据您的问题我了解到,您正在尝试检索与您的“ref”对象相关联的元数据,如果发生更改,请重新下载该文件。

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

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

val task = ref.getFile(destinationFile)

请注意getFile(File destinationFile) method that is called on a StorageReference object, returns an object of type FileDownloadTask. This class is a subclass of StorageTask, which in terms is a subclass of ControllableTask, which is also a subclass of CancellableTask.

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

Attempts to cancel the task.

为了取消任务。代码应如下所示:

task.cancel()

由于 Kotlin 是一种静态类型的编程语言,其中变量类型在编译时确定,而非 在 运行 时确定,您可以使用 valvar 定义变量时,而不是对象的类型。这使得有时难以读取对象类型。因此,由于您不能像我们在 Java:

的早期版本中那样声明上述变量
FileDownloadTask task = ref.getFile(destinationFile);

一种更易读的声明上述对象的方式是:

val fileDownloadTask = ref.getFile(destinationFile)

并取消任务:

fileDownloadTask.cancel()

现在应该更容易理解了。

编辑:

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

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