当我们希望代码在登录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
}
}
}
有办法做到这一点吗?
答案 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()涵盖了这一点。