Android firebase auth同步登录

时间:2017-02-26 19:21:13

标签: android firebase firebase-authentication

当我们希望代码在登录firebase后运行时,我们使用 addOnCompleteListener喜欢这样:

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

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

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

已经很晚了,但今天我面对这个问题,只是想和别人分享。我环顾四周,找到了一个有趣的解决方案。

因为我使用RxFirebase(此版本与RxJava兼容1.如果您使用RxJava 2,请使用Rx2Firebase),这样我就可以轻松解决此问题。只需一行代码:

FirebaseUser user = RxFirebaseAuth.signInWithCredential(
    FirebaseAuth.getInstance(), credential
).toBlocking().value();

当然,这个任务应该在后台线程上启动。

答案 1 :(得分:1)

Firebase API并未设计为公开阻止工作同步,它将阻止工作公开为要侦听的任务。

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

如您所知,Play服务(和Firebase)提供Task个对象,让您倾听成功或失败的声音。如果转换所有异步工作以使用TaskCompletionSource触发自己的Task对象完成,并收集您要等待的所有任务,则可以使用{{3来监听任务聚合集合的结果}}

我关于任务的博客系列的Tasks.whenAll()涵盖了这一点。