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

Firebase邮箱密码注册后无法跳转登录页,进度条持续显示

问题分析与解决方案

从日志和代码来看,用户注册成功、资料更新完成,但未触发数据库写入、邮件验证及页面跳转逻辑,且进度条持续显示,核心问题出在Firebase Realtime Database的写入任务未正常完成,导致后续流程中断。以下是具体排查和修复步骤:

1. 修复ReadWriteUserDetails类的序列化问题

Firebase Realtime Database要求序列化对象必须包含无参构造函数,否则无法完成对象的序列化/反序列化,会导致写入任务卡住或失败。

修改ReadWriteUserDetails类,添加默认无参构造:

public class ReadWriteUserDetails {
    public String dob;
    public String gender;
    public String mobile;

    // 必须添加默认无参构造函数
    public ReadWriteUserDetails() {}

    public ReadWriteUserDetails(String dob, String gender, String mobile) {
        this.dob = dob;
        this.gender = gender;
        this.mobile = mobile;
    }
}

2. 检查Firebase Database安全规则

确保规则允许注册用户写入自己的数据,开发阶段可临时使用宽松规则(上线前务必修改为严格权限):

{
  "rules": {
    "Registered Users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

如果规则设置为禁止写入,会导致数据库写入任务被拒绝,后续的邮件验证和跳转逻辑都无法触发。

3. 调整代码逻辑,确保进度条和流程正常执行

当前代码中,进度条隐藏逻辑被提前调用,且后续异步任务的失败情况未处理进度条。修改代码,将进度条控制逻辑移到所有异步任务的回调中:

修改registerUser方法

private void registerUser(String txtFullname, String txtEmail, String txtDob, String txtGender, String txtMobile, String txtPwd) {
    FirebaseAuth auth = FirebaseAuth.getInstance();

    auth.createUserWithEmailAndPassword(txtEmail, txtPwd)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        FirebaseUser firebaseUser = task.getResult().getUser();
                        Log.d(TAG, "User registered successfully with UID: " + firebaseUser.getUid());
                        updateUserProfile(firebaseUser, txtFullname);
                        // 数据库写入任务,后续逻辑在该方法回调中处理
                        writeUserDataToDatabase(firebaseUser, new ReadWriteUserDetails(txtDob, txtGender, txtMobile));
                    } else {
                        handleRegistrationError(task.getException());
                        // 注册失败时隐藏进度条
                        progressBar.setVisibility(View.GONE);
                    }
                }
            });
}

修改writeUserDataToDatabase方法

private void writeUserDataToDatabase(FirebaseUser user, ReadWriteUserDetails userData) {
    DatabaseReference referenceProfile = FirebaseDatabase.getInstance().getReference("Registered Users");
    referenceProfile.child(user.getUid()).setValue(userData)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "User data written to database.");
                        sendVerificationEmail(user);
                    } else {
                        Log.e(TAG, "Failed to save user data.", task.getException());
                        Toast.makeText(RegisterActivity.this, "Failed to save user data.", Toast.LENGTH_SHORT).show();
                        progressBar.setVisibility(View.GONE);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.e(TAG, "Write user data failed: ", e);
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(RegisterActivity.this, "Save data failed: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
}

修改sendVerificationEmail方法

private void sendVerificationEmail(FirebaseUser user) {
    user.sendEmailVerification()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    // 无论邮件发送成功与否,都隐藏进度条
                    progressBar.setVisibility(View.GONE);
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Verification email sent.");
                        Toast.makeText(RegisterActivity.this, "User registered successfully. Please verify your email.", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                        finish();
                    } else {
                        Log.e(TAG, "Failed to send verification email.", task.getException());
                        Toast.makeText(RegisterActivity.this, "Failed to send verification email.", Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

4. 排查其他可能问题

  • 检查设备网络连接:数据库写入和邮件发送都需要网络,网络异常会导致任务卡住
  • 查看Firebase控制台的错误日志:在Firebase控制台的Realtime Database页面查看操作日志,确认是否有写入错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:29:53