Firebase邮箱密码创建用户失败,ProgressDialog持续加载问题求助
问题排查:Firebase注册时ProgressDialog一直加载,用户创建失败
我来帮你梳理下这个问题,你的ProgressDialog一直停留在加载状态,核心原因是你没有处理Firebase Auth创建用户失败的场景,导致对话框永远没有机会被关闭。咱们一步步拆解问题并修复:
核心问题点
缺少Auth创建失败的处理逻辑
你的代码只在task.isSuccessful()为true时处理了后续逻辑,但如果创建用户失败(比如邮箱格式非法、密码长度不够、邮箱已被注册、网络异常等),onComplete方法里没有任何处理,loadingDialog就会一直显示,用户也看不到失败提示。冗余代码与潜在空指针风险
- 代码里的
enter code here是无用的占位符,需要删除; - 获取用户UID时,你已经拿到了
FirebaseUser user,直接用user.getUid()比再次调用mAuth.getCurrentUser().getUid()更安全,避免出现空指针。
- 代码里的
修改后的完整代码
private void registerSeller() { String sellerName = name.getText().toString(); String phoneNumber = phone.getText().toString(); String sellerEmail = email.getText().toString(); String sellerPassword = password.getText().toString(); String sellerAddress = address.getText().toString(); boolean cancel = false; if (sellerName.isEmpty()) { name.setError("Please Enter Your Name"); cancel = true; name.requestFocus(); } else if (phoneNumber.isEmpty()) { phone.setError("Please Enter Your Phone Number"); cancel = true; phone.requestFocus(); } else if (sellerEmail.isEmpty()) { email.setError("Please Enter Your Email Address"); cancel = true; email.requestFocus(); } else if (sellerPassword.isEmpty()) { password.setError("Please Enter Your Password"); cancel = true; password.requestFocus(); } else if (sellerAddress.isEmpty()) { address.setError("Please Enter Your Shop Address"); cancel = true; address.requestFocus(); } else { loadingDialog.setTitle("Registration Processing..."); loadingDialog.setMessage("Please wait while we are checking your credentials"); loadingDialog.setCanceledOnTouchOutside(false); loadingDialog.show(); mAuth.createUserWithEmailAndPassword(sellerEmail, sellerPassword) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { final DatabaseReference sellerRef = FirebaseDatabase.getInstance().getReference(); FirebaseUser user = mAuth.getCurrentUser(); // 用已获取的user对象获取UID,避免空指针 String sid = user.getUid(); HashMap<String, Object> sellerMap = new HashMap<>(); sellerMap.put("sid", sid); sellerMap.put("name", sellerName); sellerMap.put("phone", phoneNumber); sellerMap.put("email", sellerEmail); sellerMap.put("password", sellerPassword); sellerMap.put("address", sellerAddress); sellerRef.child("sellers").child(sid) .updateChildren(sellerMap) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { loadingDialog.dismiss(); // 无论数据库操作成功失败,先关闭对话框 if (task.isSuccessful()) { Toast.makeText(SellerRegistrationActivity.this, "Seller Registered Successfully", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(SellerRegistrationActivity.this, SellerLoginActivity.class); startActivity(intent); finish(); // 建议加上finish,避免用户返回注册页面 } else { Toast.makeText(SellerRegistrationActivity.this, "Failed to save user details: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); } else { // 新增:处理Auth创建失败的情况 loadingDialog.dismiss(); // 把具体错误信息展示给用户,方便排查 String errorMsg = task.getException() != null ? task.getException().getMessage() : "Unknown error occurred"; Toast.makeText(SellerRegistrationActivity.this, "Registration failed: " + errorMsg, Toast.LENGTH_LONG).show(); } } }); } }
额外调试建议
- 查看Logcat错误日志:打开Android Studio的Logcat面板,过滤"FirebaseAuth"或"FirebaseDatabase"标签,就能看到具体的失败原因(比如密码太短、邮箱已存在等);
- 确保Firebase权限配置正确:检查你的Firebase控制台中,数据库的规则是否允许写入操作(开发阶段可以暂时设置为
allow read, write: if true;,上线后要改为安全规则); - 初始化cancel变量:原来的代码里
cancel变量可能没有初始化,建议在方法开头加上boolean cancel = false;,避免出现不确定的布尔值。
内容的提问来源于stack exchange,提问作者Ukeme Elijah
相关产品推荐
相关产品推荐

