gpt4 book ai didi

android - 将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?

转载 作者:搜寻专家 更新时间:2023-11-01 08:17:37 24 4
gpt4 key购买 nike

我有一个使用 uploadTask 将本地文件上传到 Firestore 存储的功能。我按照 docs 中给出的说明进行操作.这是我的代码:

fun uploadAudioFile(file: File){
val audioFilePathUri = Uri.fromFile(file)
val ref = currentUserRef.child("audioFiles/" + System.currentTimeMillis() + "." + "m4a")
val uploadTask = ref.putFile(audioFilePathUri)

val urlTask =
uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
if (!task.isSuccessful) {
task.exception?.let {
throw it
}
}
return@Continuation ref.downloadUrl
}).addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
Log.d("STORAGE_UTIL", "downloadUri: " + downloadUri)
} else {
// Handle failures
}
}
}

该函数工作正常并呈现正确的 downloadUri

现在我的问题是:我想重写这个函数,以便它返回 downloadUri。像这样:

 fun uploadAudioFile(file: File): Uri? {
val audioFilePathUri = Uri.fromFile(file)
val ref = currentUserRef.child("audioFiles/" + System.currentTimeMillis() + "." + "m4a")
val uploadTask = ref.putFile(audioFilePathUri)

val urlTask =
uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
if (!task.isSuccessful) {
task.exception?.let {
throw it
}
}
return@Continuation ref.downloadUrl
}).addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
Log.d("STORAGE_UTIL", "downloadUri: " + downloadUri)
} else {
// Handle failures
}
}
return downloadUri
}

这给了我一个关于返回语句的 downloadUri Unresolved 引用。我该如何解决这个问题?

最佳答案

您无法将 downloadUri 作为方法的结果返回,这是因为 Firebase API 是异步。这意味着 onComplete() 函数在被调用后立即返回,并且它返回的 Task 的回调将在稍后调用。因此,不幸的是,无法保证需要多长时间,可能需要几百毫秒到几秒才能获得数据。因为该方法会立即返回,所以您尝试返回的 downloadUri 变量的值尚未从回调中填充。

基本上,您正在尝试从异步 API 同步返回一个值。那不是一个好主意。您应该按预期异步处理 API。

快速解决此问题的方法是在 onComplete() 方法中使用 downloadUri 变量 only 的值。基本上,uploadAudioFile() 方法中存在的所有逻辑都应该移到回调中。如果您想在回调之外使用该值,我建议您从这个 post 中看到我的答案的最后一部分。 我在其中解释了如何使用自定义回调来完成。

关于android - 将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57818573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com