如何在 Android 中使用 WorkManager 从 Firebase 存储下载文件

How to download files from Firebase Storage using WorkManager in Android

我尝试使用 WorkManager 每 2 小时从 Firebase 存储下载一个 zip 文件。 下面是dowork函数。

override fun doWork(): Result {
    val storage = FirebaseStorage.getInstance()
    val storageRef = storage.reference
    val pathReference = storageRef.child("customerdata.zip")

    Log.v("SysLog", "File download starting...") // This log can be seen in Logcat

    val localFile = File.createTempFile("customerdata", ".zip")

    pathReference.getFile(localFile).addOnSuccessListener {
        Log.v("SysLog", "File downloaded successfully")
    }.addOnFailureListener {
        Log.v("SysLog", "File download failed with error: ${it.localizedMessage}")
    }

    return Result.success()
}

dowork 方法的调用没有任何问题。但是 addOnSuccessListener 永远不会被调用。大约 10 分钟后 addOnFailureListener 被调用并显示错误消息

The operation retry limit has been exceeded

只有当应用程序最小化并且手机屏幕关闭时才会出现此问题。否则整个工作。

我做错了什么?

getFile() 是异步的,并且总是立即 returns。附加到任务的回调 returns 会在一段时间后,即下载完成后调用。这意味着您的 doWork 功能总是 returns Result.success() 立即,无论下载发生什么。这不是您想要的 - 您的函数应该 return 仅在 下载完成后 结果。

您需要:

  1. 使该功能块直到下载完成。
  2. 使用 WorkManager worker 的异步版本 return 一个在工作完成时触发的 ListenableFuture。