作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个使用 Firebase 做两件事的客户端应用程序:
val user = FirebaseAuth.getInstance().currentUser
if (user != null) {
user.getIdToken(false).addOnCompleteListener {
if (it.isSuccessful) {
val token = it.result?.token
//retrofit logic to send request happens from here
}
}
如您所见,获取用户的 Id token 是一个异步调用,在我拥有的当前代码库中,我对后端的每个调用(重复)都有这个代码块。
fun fetchDataFromDB() {
getIdTokenForUser()
//wait till it finishes and then
//perform request to DB
}
fun updateDataInDB() {
getIdTokenForUser()
//wait till it finishes and then
//perform request to DB
}
//......
我曾尝试阅读和实现协程,但我缺乏正确执行此操作的知识。
private suspend fun getUserIdToken(user: FirebaseUser) = coroutineScope {
val job = async {
user.getIdToken(false).result?.token
}
job.await()
}
我以这种方式使用它:
fun updateDB(context: Context) = runBlocking {
val user = FirebaseAuth.getInstance().currentUser
if (user != null) {
val token = getUserIdToken(user)
}
}
这是正确的方法吗? 由于下面给出的答案提出了不同的实现。
最佳答案
getIdToken
是异步返回一个Task对象。如果要在 Kotlin 协程中使用 Task 对象,可以使用库 kotlinx-coroutines-play-services添加扩展方法await()
到使它在协程中可用的任务。有了它,你可以写这样的东西:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.3.9"
import kotlinx.coroutines.tasks.await
suspend fun getIdTokenForUser(user: FirebaseUser): GetTokenResult {
return try {
user.getIdToken(false).await()
}
catch (e: Exception) {
// handle error
}
}
您可能必须在此处更新类型 - 我没有尝试编译或测试它。
关于android - 如何在 OnCompleteListener Firebase 中使用 Async/Await/Coroutines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64088407/
我是一名优秀的程序员,十分优秀!