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
相关产品推荐
相关产品推荐

