我有一个登录活动,该活动从另一个Java类调用方法“登录”。在“登录”活动中,当按下“登录”按钮时,它将从另一个类调用“登录”方法,如果所有登录详细信息正确无误,则该方法将返回true。
我已经尝试过将全局变量声明为final,但是无法操作该变量。
代码:
public boolean LogIn(String email, String password) {
boolean success = false;
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
success = true; // Error here
} else {
success = false; // Error here
}
}
});
return success;
}
答案 0 :(得分:1)
signInWithEmailAndPassword
是异步的,并立即与Task对象一起返回,以跟踪正在进行的工作。这意味着LogIn
也会立即返回success
的初始值。一段时间后,只要数据准备就绪,就会调用Task的完成侦听器。在那儿您应该处理登录结果。
您正在尝试将异步方法转换为同步方法。这不是一个好主意。使用侦听器处理结果。您无法将值传递给该侦听器。
答案 1 :(得分:0)
错误是,如果您在匿名内部类中使用局部变量,则无法更改Java匿名内部类中局部变量的状态,这些局部变量将被视为最终变量。在您的情况下,布尔值成功是logIn方法中的局部变量,它被视为最终变量,您无法在匿名内部类中对其进行重新分配。
您认为这会有所帮助
公共布尔值LogIn(字符串电子邮件,字符串密码){ StringBuffer buffer = new StringBuffer(“”): firebaseAuth.signInWithEmailAndPassword(电子邮件,密码).addOnCompleteListener(new OnCompleteListener(){ @Override 公共无效onComplete(@NonNull任务任务){ 如果(task.isSuccessful()){ 缓冲。 append(“ true”); }其他{ 缓冲。 append(“ false”); } } }); 返回缓冲区。 toString()。 equals(“ true”); }
答案 2 :(得分:0)
您可以在此处使用AtomicBoolean作为最终类在内部类中使用,但是由于该函数是异步的,因此未正确设置LogIn返回值,并且必须更改处理登录请求的方式。