Как преобразовать задачу Android в отложенный Kotlin? - PullRequest
0 голосов
/ 22 мая 2018

При анонимном входе в Firebase возвращается задача (что в основном реализация обещания Google ):

val task:Task<AuthResult> = FirebaseAuth.getInstance().signInAnonymously()

Как можно было бы создать signInAnonymousобертка где:

  • Это suspend функция, ожидающая завершения task

    • suspend fun signInAnonymous(): Unit
  • Возвращает Deferred объект, доставляющий результат асинхронно

    • fun signInAnonymous() : Deferred

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Чтобы превратить его в функцию, готовую к сопрограммам, я бы использовал функцию Tasks.await() из API задач:

suspend fun FirebaseAuth.signInAnonymouslyAwait(): AuthResult {
    return Tasks.await(this.signInAnonymously())
}

Что касается Отложенных, я бы придерживался ответа zsmb13

0 голосов
/ 22 мая 2018

Основываясь на этой библиотеке GitHub , мы можем преобразовать Task в функцию приостановки обычным способом для адаптации асинхронных вызовов на основе обратного вызова к сопрограммам:

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

Вы также можете обернуть его в Deferred, конечно, CompletableDeferred пригодится здесь:

fun <T> Task<T>.asDeferred(): Deferred<T> {
    val deferred = CompletableDeferred<T>()

    deferred.invokeOnCompletion {
        if (deferred.isCancelled) {
            // optional, handle coroutine cancellation however you'd like here
        }
    }

    this.addOnSuccessListener { result -> deferred.complete(result) }
    this.addOnFailureListener { exception -> deferred.completeExceptionally(exception) }

    return deferred
}
...