为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2022-05-12 16:25:46
我有一个登录活动,它从另一个 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 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

signInWithEmailAndPassword是异步的,并立即返回一个跟踪正在进行的工作的 Task 对象。这意味着LogIn也立即返回初始值success。一段时间后,只要数据准备好,就会调用 Task 上的完成侦听器。这就是您应该处理登录结果的地方。

您正在尝试将异步方法转换为同步方法。这不是一个好主意。使用监听器来处理结果。您不能从该侦听器中传递值。


查看完整回答
反对 回复 2022-05-12
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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



查看完整回答
反对 回复 2022-05-12
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

错误是如果您在匿名内部类中使用局部变量,则无法更改 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") ; } } }); 返回缓冲区。字符串()。等于(“真”);}


查看完整回答
反对 回复 2022-05-12
  • 3 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号