我没有收到使用createUserwithEmailAndPassword()
创建用户的任何回调。我可能在这里遗漏了一些明显的东西,但似乎无法弄清楚。
我已经从Firebase控制台启用了用户名和密码选项,该用户已添加到Firebase用户的记录中,但是没有监听器触发。
这是我创建用户的代码。
firebaseAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth)
{
// this is not called.
synchronized (RegisterUser.this) {
RegisterUser.this.notify();
}
}
});
Task<AuthResult> taskResult = firebaseAuth.createUserWithEmailAndPassword(model.getEmailId().getValue(),
model.getPassword().getValue())
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
// this never gets called.
if (task.isSuccessful()) {
synchronized (RegisterUser.this) {
RegisterUser.this.notify();
}
}
else {
Logger.e(TAG, "Unable to register user.");
}
}
});
taskResult.isSuccessful(); // returns false makes sense because it's a network call.
synchronized (RegisterUser.this) {
RegisterUser.this.wait();
}
我也尝试过同时添加OnSuccessListener
和OnFailureListener
,但它们也从未被调用。
编辑:
因此,感谢@DougStevensen的回答,意识到了我的错误。我有多个正在运行的线程,结果发现其中有一个wait()
语句,即使我通过了Executor
并认为回调来自Executor
,但该语句阻止了回调。提供的线程。
答案 0 :(得分:1)
您似乎正在阻塞主线程:
synchronized (RegisterUser.this) {
RegisterUser.this.wait();
}
希望回调能够解除阻止:
if (task.isSuccessful()) {
synchronized (RegisterUser.this) {
RegisterUser.this.notify();
}
}
这行不通。首先,在Android上,您永远不要阻塞主线程。这将导致您的应用程序挂起并最终ANR。其次,默认情况下,任务异步回调全部发生在主线程上。因此,如果您阻塞主线程,则回调将永远不会发生。
您应该采用适当的Android异步编程实践,而不是使用Java同步原语来阻塞主线程。首先要做的是删除所有这些synchronized
块,以便您可以看到回调被调用了。