You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android注册页面点击Next按钮后应用崩溃问题求助

问题排查与修复方案

核心问题点

  1. 错误的事件嵌套:将按钮点击事件放在FirebaseAuth.AuthStateListener的onAuthStateChanged方法内部,会导致每次用户认证状态变更时重复绑定点击事件,引发逻辑混乱甚至崩溃。
  2. 实时数据库数据存储不完整:当前代码仅向users/individuals/{uid}写入true,并未存储邮箱信息(注意:Firebase Authentication的密码不应该存储到实时数据库,这是安全风险)。
  3. 潜在空指针风险:mAuth.getCurrentUser()在极端情况下可能为空,直接调用getUid()会触发空指针异常。
  4. 语法结构不完整:原代码中AuthStateListener未闭合,onCreate方法也未完成,编译或运行时会报错。

修复后的完整代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    
    mAuth = FirebaseAuth.getInstance();
    mEmail = findViewById(R.id.regemail);
    mPassword = findViewById(R.id.password);
    mconpassword = findViewById(R.id.conpassword);
    mbregister = findViewById(R.id.regbtn);
    mlogrdrct = findViewById(R.id.logredrc);

    // 正确绑定按钮点击事件,不要嵌套在AuthStateListener内
    mbregister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final String email = mEmail.getText().toString().trim();
            final String password = mPassword.getText().toString().trim();
            String confirmPassword = mconpassword.getText().toString().trim();

            // 输入校验
            if (TextUtils.isEmpty(email)) {
                mEmail.setError("请输入邮箱");
                return;
            }
            if (TextUtils.isEmpty(password)) {
                mPassword.setError("请输入密码");
                return;
            }
            if (!password.equals(confirmPassword)) {
                mconpassword.setError("两次输入的密码不一致");
                return;
            }

            // 创建用户
            mAuth.createUserWithEmailAndPassword(email, password)
                    .addOnCompleteListener(register.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (!task.isSuccessful()) {
                                Toast.makeText(register.this, "注册失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                return;
                            }

                            // 获取当前用户,增加非空判断
                            FirebaseUser currentUser = mAuth.getCurrentUser();
                            if (currentUser == null) {
                                Toast.makeText(register.this, "用户信息获取失败", Toast.LENGTH_SHORT).show();
                                return;
                            }

                            String uid = currentUser.getUid();
                            DatabaseReference currUserDb = FirebaseDatabase.getInstance()
                                    .getReference().child("users").child("individuals").child(uid);

                            // 存储用户邮箱(不要存密码)
                            HashMap<String, Object> userMap = new HashMap<>();
                            userMap.put("email", email);
                            // 可添加其他需要存储的字段,比如用户类型等
                            userMap.put("userType", "individual");

                            currUserDb.setValue(userMap)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void unused) {
                                            // 数据库写入成功后再跳转页面
                                            Intent intent = new Intent(register.this, registerSTEP2.class);
                                            startActivity(intent);
                                            finish();
                                        }
                                    })
                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Toast.makeText(register.this, "用户信息存储失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                                        }
                                    });
                        }
                    });
        }
    });

    // 如果需要监听Auth状态变化,单独处理,不要嵌套点击事件
    FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            // 这里处理用户登录/登出等状态变更逻辑,比如自动跳转首页等
        }
    };
    mAuth.addAuthStateListener(authStateListener);
}

额外注意事项

  • 密码存储:永远不要将用户的密码存储到实时数据库或其他公开存储中,Firebase Authentication已经安全管理了密码,无需重复存储。
  • 权限配置:确保Firebase实时数据库的规则配置正确,允许新注册的用户写入自己的信息(比如设置"users/individuals/{uid}": { "write": "auth.uid === {uid}" })。
  • 异常信息展示:在onFailure中展示具体的异常信息,方便调试问题(比如数据库权限不足、网络问题等)。

内容的提问来源于stack exchange,提问作者tut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:33:12