【问题标题】:WorkManager wait for upload to finish before moving on to the next work requestWorkManager 在继续下一个工作请求之前等待上传完成
【发布时间】:2020-10-30 19:58:54
【问题描述】:

我在我的 Android 应用程序中使用 WorkManager。 我已经设置了一个工作请求,并在其 doWork() 方法中将文件上传到 Firebase 存储。 我想将此工作请求与另一个链接,但我需要在下一个请求开始之前(在我返回 Result.success 之前)完成上传(以获取下载 URL)。 我怎样才能完成这项工作? 我可以在 doWork() 方法中使用 LiveData 吗? 如何在返回工作结果之前等待回调?

*顺便说一句,我试图避免多余的 firebase 调用,因此写入数据库,然后使用我获得的 URL 更新数据库的选项对我不起作用。

代码:

class UploadWorker(context: Context, workerParams: WorkerParameters): Worker(context,workerParams)
{
    override fun doWork(): Result
    {
        //get input
        ...
        //store file in Firebase
        val storage = FirebaseStorage.getInstance()
        val storageRef = storage.reference
        val fileRef = storageRef.child(filePath.toString())

        val uploadTask = fileRef.putBytes(file)
        var downloadFileUrl: String? = ""

        uploadTask.continueWithTask { task ->
            if (!task.isSuccessful)
            {
                task.exception?.let { throw it }
            }
            fileRef.downloadUrl
        }.addOnCompleteListener { task ->
            if (task.isSuccessful)
            {
                //this is what I want to save before the return of doWork()
                downloadFileUrl = task.result.toString()
            }
            else
            {
                // Handle failures
                Log.d("fb", "fail")
            }
        }

        return Result.success()
    }
}

【问题讨论】:

  • 是的,我了解如何实现链接部分,问题是在继续之前等待回调
  • 您可以使用com.google.android.gms.tasks.Tasks.await(task) 删除回调并将其视为同步调用
  • 你能不能说的更具体一些或者举个例子?

标签: android firebase firebase-storage android-workmanager


【解决方案1】:

只需使用您的uploadTask 并使用Tasks.await()

我不知道确切的语法,但它是这样的

override fun doWork(): Result{
    .....
    val uploadTask = fileRef.putBytes(file)
    val taskResult = Tasks.await(uploadTask) 
    downloadFileUrl = taskResult.result.toString()
    ....
    return Result.success()
}

【讨论】:

  • 谢谢!我试试看。
【解决方案2】:

如果以后有人遇到同样的问题,你需要使用的是存储引用,而不是上传任务

override fun doWork(): Result{
    .....
    val downloadUriTask = Tasks.await(imageRef.downloadUrl)
    val url = downloadUriTask.toString()
    ....
    return Result.success()
}

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多