相关疑难解决方法(0)

将 Firebase 与 Kotlin 协程结合使用

我在我的应用程序中使用 Kotlin 协程,并选择了 firebase 作为我的数据库和存储选择。在探索 firebase 之后,我意识到它的所有 API 都是异步的,并且异步调用的结果在回调中返回,而摆脱回调是我在我的应用程序中使用 Kotlin 协程的主要原因。

这是我编写的将文件上传到 firebase 云存储的代码,但它给出了“任务尚未完成”错误。

private suspend fun saveImage(filePath: String): String? {
        val storage = FirebaseStorage.getInstance("gs://myapp-9a648.appspot.com/")
        val storageRef = storage.reference
        val file = Uri.fromFile(File(filePath))
        val imageRef = storageRef.child("images/${file.lastPathSegment}")
        return withContext(Dispatchers.IO) {
            imageRef.putFile(file).snapshot.storage.downloadUrl.result.toString()
        }
    }
Run Code Online (Sandbox Code Playgroud)

E/AndroidRuntime:致命异常:主进程:pk.com.kotlinapp,PID:7491 java.lang.IllegalStateException:com.google.android.gms.common.internal.Preconditions.checkState(未知来源)处的任务尚未完成在 com.google.android.gms.tasks.zzu.zzb(未知来源)在 com.google.android.gms.tasks.zzu.getResult(未知来源)在 prk.com.kotlinapptest.DatabaseManager$saveImage$2.invokeSuspend( DatabaseManager.kt:28) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241) at kotlinx.coroutines.scheduling.CoroutineSafelyScheduler. (CoroutineScheduler.kt:594) 在 kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 在 kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740)

有什么方法可以将文件上传到 firebase 云存储并获取下载 URL,而无需在成功回调中获取下载 URL?

android kotlin firebase kotlin-coroutines

6
推荐指数
1
解决办法
2087
查看次数

使用协程执行的 Android kotlin 任务

例如,我使用 FusedLocationProviderClient 来访问当前位置,它返回一个任务,该回调最终将返回该位置。该方法如下所示:

fun getLocation(callback: MyCallback){
    val flpc = LocationServices.getFusedLocationProviderClient(it)
    flpc.lastLocation.addOnSuccessListener {
        callback.onLocation(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以对其进行转换,以便我可以使用 corroutines 挂起此函数并等待返回的任务,flpc.lastLocation以便我可以在此方法中返回它并以这种方式摆脱该回调?例如这样的事情:

suspend fun getLocation(): Location? =
    withContext(Dispachers.IO){
        val flpc = LocationServices.getFusedLocationProviderClient(it)
        return@withContext flpc.lastLocation.result()
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,在协程周围是否有一些东西可以返回 a Task(在本例中为 a Task<Location>)的结果

提前致谢!

android task kotlin-coroutines

5
推荐指数
1
解决办法
1010
查看次数

标签 统计

android ×2

kotlin-coroutines ×2

firebase ×1

kotlin ×1

task ×1