在内部类中访问如何解析变量,并且需要将其声明为final

时间:2019-01-20 00:07:23

标签: java firebase firebase-authentication

我有一个登录活动,该活动从另一个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;
}

3 个答案:

答案 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返回值,并且必须更改处理登录请求的方式。