如何在 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 仅在 下载完成后 结果。
您需要:
- 使该功能块直到下载完成。
- 使用 WorkManager worker 的异步版本 return 一个在工作完成时触发的 ListenableFuture。
我尝试使用 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 仅在 下载完成后 结果。
您需要:
- 使该功能块直到下载完成。
- 使用 WorkManager worker 的异步版本 return 一个在工作完成时触发的 ListenableFuture。