我的主要活动中有此方法,只有在确认用户帐户已成功创建后,我才能继续操作。当我单击确认时,我可以看到该帐户是在firebase上创建的,但是似乎从未调用过onCompleteListener,因此我的倒计时闩锁的价值从未降低。
public boolean signUpUser(User user)
{
FirebaseApp.initializeApp(this);
FirebaseAuth firebaseAuth=FirebaseAuth.getInstance();
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
// success = false;
CountDownLatch countDownLatch = new CountDownLatch(1);
Log.e("Account","Creating user");
firebaseAuth.createUserWithEmailAndPassword(user.getEmail(),user.getPassword()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(Task<AuthResult> task) {
Log.e("Account","User Created");
if(task.isSuccessful())
{
//createProfile(user,task);
success = true;
}
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
return success;
}
答案 0 :(得分:0)
我曾经遇到过与您几乎相同的问题。我所做的是将OnCompleteListener
替换为addOnSuccessListener
,一切都解决了。
尝试使用此代码:
firebaseAuth.signInWithEmailAndPassword(user.getEmail(),user.getPassword())
.addOnSuccessListener(LoginActivity.this, new OnSuccessListener<AuthResult>(){
@Override
public void onsuccess(@NonNull AuthResult authResult){
//try to run something in here
}
});
希望这也能解决您的问题。
答案 1 :(得分:0)
您现在无法返回尚未加载的内容。换句话说,您不能简单地在success
方法之外返回onComplete()
布尔变量,因为由于该方法的异步行为,它将始终保留默认值false
。这意味着,当您尝试返回该结果时,数据尚未从数据库中完成加载,因此无法访问。这就是为什么要保留false
的初始值,而又不 true
保持初始值的原因。
对此问题的快速解决方案是仅在success
方法内使用与您的onComplete()
变量相关的逻辑,否则我建议您从此看我的答案的最后一部分post ,其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。
答案 2 :(得分:0)
遇到了同样的问题,原来我是在onComplete结束之前更改活动。 如果要更改活动(例如,在成功签名后转到仪表板活动),请确保在onComplete任务成功内调用startActivity(intent)