如何将Android任务转换为Kotlin任务?

如何将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

Firebase匿名登录返回一个(基本上是):

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()
}