当我使用Firebase身份验证成功签名时,我试图创建一个给我一个布尔值的方法,问题是我总是变得虚假,即使日志说它不是真的。
这是我的方法:
public boolean signIn(String email, String password, final Context context) {
Log.d(TAG, "signIn:" + email);
final boolean[] resultado = {false};
mAuth = FirebaseAuth.getInstance();
// [START sign_in_with_email]
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
userFire = mAuth.getCurrentUser();
resultado[0] = true;
Log.w(TAG, "signInWithEmail:succes");
} else {
Log.w(TAG, "signInWithEmail:failure", task.getException());
}
}
});
return resultado[0];
}
知道如何确保我得到正确的结果吗?
答案 0 :(得分:3)
Firebase API是异步,这意味着signInWithEmailAndPassword
在调用后立即返回,并且它返回的任务的回调将在稍后调用。无法保证需要多长时间。由于该方法会立即返回,因此尚未从回调中填充您返回的值(resultado[0]
)。
基本上,您尝试从异步的API同步返回值。那不是个好主意。您应该按预期异步处理API。
要详细了解Firebase API为何异步以及您可以从中获得什么,read this article。
答案 1 :(得分:2)
您无需使用boolean
来检查登录是否正确。
通过以下方法为您完成:
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
如果登录验证成功,则用户将能够登录。
您可以添加Log
来检查或向用户显示的祝酒词,告诉他是否成功。
这是另一种选择,因为返回布尔值将不起作用。