Kotlin Coroutines中与RXJava等效的Completable.create-Android

时间:2019-12-01 14:57:32

标签: android kotlin

我正在研究Firebase身份验证,其中需要将Firebase身份验证放在我的存储库中。我找到了有关如何执行此操作的文章,但它使用RxJava。 (https://www.simplifiedcoding.net/firebase-mvvm-example/

现在,我想知道是否只有kotlin解决方案,因为我不想使用RxJava,因为我正在使用kotlin协程。

fun facebookLogin(credential: AuthCredential) = Completable.create { emitter -> // change Completable.create since it is a RxJava
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task ->
        if (!emitter.isDisposed) {
            if (task.isSuccessful)
                emitter.onComplete()
            else
                emitter.onError(task.exception!!)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

Continuation  允许您将同步转换为异步

过去,在协程官方代码实验室中对此有一些看法,但他们似乎已将其删除。样板大致如下:

suspend fun facebookLogin(...): Boolean {
  return   suspendCoroutine { continuation -> 
      firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task ->

            if (task.isSuccessful)
                continuation.resume(true)
            else
                continuation.resumeWith(Result.failure(task.exception))
        }
    }
  }  
}

要从ViewModel调用它,

fun login () {
   viewModelScope.launch{
      facebookLogin(...)
   }
}

如果不在视图模型上,则可以随时

CoroutineContext(Dispatchers.IO).launch{
   facebookLogin(...)
}