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

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

}


红糖糍粑
浏览 179回答 3
3回答

拉丁的传说

signInWithEmailAndPassword是异步的,并立即返回一个跟踪正在进行的工作的 Task 对象。这意味着LogIn也立即返回初始值success。一段时间后,只要数据准备好,就会调用 Task 上的完成侦听器。这就是您应该处理登录结果的地方。您正在尝试将异步方法转换为同步方法。这不是一个好主意。使用监听器来处理结果。您不能从该侦听器中传递值。

慕侠2389804

您可以在这里使用 AtomicBoolean 作为 final 在内部类中使用,但由于该函数是异步的,LogIn 返回值设置不正确,您必须更改处理登录请求的方式。

叮当猫咪

错误是如果您在匿名内部类中使用局部变量,则无法更改 java 中匿名内部类中局部变量的状态,这些局部变量将被视为最终变量。在您的情况下,布尔成功是 logIn 方法中的局部变量,它被视为最终变量,您不能在匿名内部类中重新分配它。在你的情况下认为这会有所帮助public boolean LogIn(String email, String password) { StringBuffer buffer = new StringBuffer("") : firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { buffer.append("true") ; } else { buffer.append("false") ; } } });&nbsp;返回缓冲区。字符串()。等于(“真”);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java