如何将Android任务转换为Kotlin任务?
Firebase匿名登录返回一个(基本上是):如何将Android任务转换为Kotlin任务?,android,firebase,kotlin,kotlinx.coroutines,Android,Firebase,Kotlin,Kotlinx.coroutines,Firebase匿名登录返回一个(基本上是): val task:task=FirebaseAuth.getInstance().signinanoymously() 如何创建一个signinanoymous包装,其中: 它是一个suspend功能,等待任务完成 nanonymous():单位 它返回一个延迟的对象,异步传递结果 name():延迟 基于,这里有一种方法可以将任务转换为中的挂起函数,以使基于回调的异步调用适应协同路由: suspend fun <T> Ta
val task:task=FirebaseAuth.getInstance().signinanoymously()
如何创建一个signinanoymous
包装,其中:
- 它是一个
功能,等待suspend
任务完成
nanonymous():单位
- 它返回一个
对象,异步传递结果延迟的
name():延迟
任务
转换为中的挂起函数,以使基于回调的异步调用适应协同路由:
suspend fun <T> Task<T>.await(): T = suspendCoroutine { continuation ->
addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result)
} else {
continuation.resumeWithException(task.exception ?: RuntimeException("Unknown task exception"))
}
}
}
要将其转换为支持协同程序的函数,我将使用Tasks API中的
Tasks.await()
函数:
suspend fun FirebaseAuth.signInAnonymouslyAwait(): AuthResult {
return Tasks.await(this.signInAnonymously())
}
至于延迟,我坚持使用zsmb13的答案该软件包现在包括以下实用程序功能:
public suspend fun <T> Task<T>.await(): T { ... }
或:
nanonymouslydeferred():Deferred{
返回FirebaseAuth.getInstance().signinanoymously().asDeferred()
}
将此添加到gradle
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.4.3'
然后你可以这样使用它:
suspend fun login(email: String, pass: String) {
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, pass).await()
}
如何从该函数返回值@zsmb13这两个函数都需要在异步内部调用。e、 g:
val-tokenFirebase:String=FirebaseInstanceId.getInstance().instanceId.asDeferred().await().token
和val-tokenFirebase:String=FirebaseInstanceId.getInstance().instanceId.await().token
//await()显示警告,相反:挂起函数“await”应仅从一个协同程序或另一个挂起函数调用是的,Deferred
上的await
和我的答案中显示的await
都需要在协同程序内调用,因为它们是挂起函数。不过我不太确定你在问什么。如果您询问如何启动协同路由,您应该看到。在我的例子中,我想从firebase获取令牌,但如何从异步协同路由返回值。我试过:val newToken:String by lazy{val token=with(FirebaseInstanceId.getInstance().instanceId){/*GlobalScope.asDeferred().await()}*///为什么?我们等待()这个?如果(asDeferred().isCompleted&&result!=null&&issucessful)结果?.token?:“else”“}token}< /代码> @ ZSMB13,但空白还是空字符串仍然返回,还是我用错误的方式?感谢那些寻找maven存储库的人,这里是博客解释
public fun <T> Task<T>.asDeferred(): Deferred<T> { ... }
suspend fun signInAnonymouslyAwait(): AuthResult {
return FirebaseAuth.getInstance().signInAnonymously().await()
}
fun signInAnonymouslyDeferred(): Deferred<AuthResult> {
return FirebaseAuth.getInstance().signInAnonymously().asDeferred()
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.4.3'
suspend fun login(email: String, pass: String) {
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, pass).await()
}