Android的Firebase身份验证同步登录

当我们想让代码在登录到addOnCompleteListener后运行,我们使用addOnCompleteListener这样:

 void signInToFirebaseUsing(GoogleSignInAccount googleAccount) { AuthCredential credential = GoogleAuthProvider.getCredential(googleAccount.getIdToken(), null) firebaseAuth.signInWithCredential(credential) .addOnCompleteListener { ... if (task.isSuccessful()) { ... } else { ... } } } 

然而,firebase不是我想登录的唯一服务。我需要一个同步的firebase登录,所以我可以处理多个身份验证(我使用Kotlin和AsyncAwait库 ,但你明白了):

 private fun signInToAppUsing(googleAccount: GoogleSignInAccount) { async { try { await { signInToRealmUsing(googleAccount) } await { signInToFirebaseUsing(googleAccount) } // <- this won't work because firebase uses asynchronous listener // User is signed in all services } catch (e: Exception) { // Signing in some service crashed } } } 

有没有办法做到这一点?

Firebase API的设计目的并不在于阻止同步工作,而是将阻止工作公开为要侦听的任务。

因此,您可以管理您自己的对象,以保持您要跟踪完成的所有异步工作的状态记录。 然后,当最后一件事完成时,继续你想要的任何逻辑。

如您所知,Play服务(和Firebase)提供了可让您聆听成功或失败的Task对象。 如果使用TaskCompletionSource转换所有异步工作以触发自己的Task对象完成,并收集所有您想等待的任务,则可以使用Tasks.whenAll()来侦听任务集合的结果。

我的关于任务的博客系列的第四部分涵盖了这一点。