gpt4 book ai didi

android - 如何使用 kotlin 协程处理回调

转载 作者:行者123 更新时间:2023-12-05 00:10:29 25 4
gpt4 key购买 nike

以下代码段在顺序代码流中将结果返回为“null”。我了解协程可能是异步处理回调的可行解决方案。


fun getUserProperty(path: String): String? {
var result: String? = null
database.child(KEY_USERS).child(getUid()).child(path)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(error: DatabaseError) {
Log.e(TAG, "error: $error")
}

override fun onDataChange(snapshot: DataSnapshot) {
Log.w(TAG, "value: ${snapshot.value}")
result = snapshot.value.toString()
}
})
return result
}

在这种情况下协程是否可以帮助等待回调的结果(onDataChange()/onCancelled())?

最佳答案

由于 Firebase 实时数据库 SDK 不提供任何挂起功能,协程在处理其 API 时没有帮助。您需要将回调转换为挂起函数,以便能够在协程中等待结果。

这是一个暂停扩展功能(我 discovered a solution 通过谷歌搜索):

suspend fun DatabaseReference.getValue(): DataSnapshot {
return async(CommonPool) {
suspendCoroutine<DataSnapshot> { continuation ->
addListenerForSingleValueEvent(FValueEventListener(
onDataChange = { continuation.resume(it) },
onError = { continuation.resumeWithException(it.toException()) }
))
}
}.await()
}

class FValueEventListener(val onDataChange: (DataSnapshot) -> Unit, val onError: (DatabaseError) -> Unit) : ValueEventListener {
override fun onDataChange(data: DataSnapshot) = onDataChange.invoke(data)
override fun onCancelled(error: DatabaseError) = onError.invoke(error)
}

有了这个,你现在如何 getValue()可以在协程中等待的 DatabaseReference 上的可疑方法。

关于android - 如何使用 kotlin 协程处理回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57834950/

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