FirebaseAuth侦听器未调用

时间:2019-12-29 20:04:28

标签: android firebase-authentication

我没有收到使用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();
}

我也尝试过同时添加OnSuccessListenerOnFailureListener,但它们也从未被调用。

编辑:

因此,感谢@DougStevensen的回答,意识到了我的错误。我有多个正在运行的线程,结果发现其中有一个wait()语句,即使我通过了Executor并认为回调来自Executor,但该语句阻止了回调。提供的线程。

1 个答案:

答案 0 :(得分:1)

您似乎正在阻塞主线程:

synchronized (RegisterUser.this) {
    RegisterUser.this.wait();
}

希望回调能够解除阻止:

if (task.isSuccessful()) {
    synchronized (RegisterUser.this) {
        RegisterUser.this.notify();
    }
}

这行不通。首先,在Android上,您永远不要阻塞主线程。这将导致您的应用程序挂起并最终ANR。其次,默认情况下,任务异步回调全部发生在主线程上。因此,如果您阻塞主线程,则回调将永远不会发生。

您应该采用适当的Android异步编程实践,而不是使用Java同步原语来阻塞主线程。首先要做的是删除所有这些synchronized块,以便您可以看到回调被调用了。