WorkManager等待上载完成,然后继续下一个工作请求

时间:2020-10-30 19:58:54

标签: android firebase firebase-storage android-workmanager

我在Android应用中使用WorkManager。 我已经设置了一个工作请求,并在其doWork()方法中将文件上传到Firebase Storage。 我想将此工作请求与另一个请求链接在一起,但是我需要在下一个请求开始之前(在我返回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()
    }
}

1 个答案:

答案 0 :(得分:0)

只需拿起uploadTask并使用Tasks.await()

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

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