注册页面点击创建账号卡顿无跳转,Firebase实时数据库未存数据
注册页面卡顿、数据无法保存到Firebase实时数据库的问题修复
以下是代码中存在的核心问题及对应的修复方案:
1. 手机号获取错误
在CreateAccount()方法中,错误地从密码输入框获取手机号,导致后续数据库验证和存储逻辑完全偏离预期:
// 错误代码 String phone = InputPassword.getText().toString(); // 修正后代码 String phone = InputPhoneNumber.getText().toString();
2. DataSnapshot引用错误
onDataChange()回调中使用了未初始化的全局dataSnapshot变量,而非方法参数传入的snapshot,会触发空指针异常,导致代码执行中断、加载框无法关闭,页面持续卡顿:
// 错误代码 if (!(dataSnapshot.child("Users").child(phone).exists())) { // 修正后代码 if (!(snapshot.child("Users").child(phone).exists())) {
3. 注册成功后跳转错误
注册成功后跳转到当前注册页面,导致用户重复进入注册流程,应改为跳转到主页面或登录页面:
// 错误代码 Intent intent = new Intent(RegisterActivity.this, RegisterActivity.class); // 修正后代码 Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
4. onCancelled回调未处理
onCancelled()方法空实现,当数据库请求被取消时,加载框会一直显示,导致页面卡顿。需补充关闭加载框并提示用户的逻辑:
@Override public void onCancelled(@NonNull DatabaseError error) { loadingBar.dismiss(); Toast.makeText(RegisterActivity.this, "请求被取消:" + error.getMessage(), Toast.LENGTH_SHORT).show(); }
5. 字符串拼接格式错误
手机号已存在的提示字符串缺少空格,显示不规范:
// 错误代码 Toast.makeText(RegisterActivity.this, "This "+ phone +"already exists.", Toast.LENGTH_SHORT).show(); // 修正后代码 Toast.makeText(RegisterActivity.this, "This " + phone + " already exists.", Toast.LENGTH_SHORT).show();
修正后的完整代码
package com.example.ecom; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressDialog; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.HashMap; public class RegisterActivity extends AppCompatActivity { private Button CreateAccountButton; private EditText InputName, InputPhoneNumber, InputPassword; private ProgressDialog loadingBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); CreateAccountButton = findViewById(R.id.register_btn); InputName = findViewById(R.id.register_username_input); InputPhoneNumber = findViewById(R.id.register_phone_number_input); InputPassword = findViewById(R.id.register_password_input); loadingBar = new ProgressDialog(this); CreateAccountButton.setOnClickListener(v -> CreateAccount()); } private void CreateAccount() { String name = InputName.getText().toString(); String phone = InputPhoneNumber.getText().toString(); String password = InputPassword.getText().toString(); if (TextUtils.isEmpty(name)) { Toast.makeText(this, "请输入您的姓名...", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(phone)) { Toast.makeText(this, "请输入您的手机号...", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)) { Toast.makeText(this, "请输入您的密码...", Toast.LENGTH_SHORT).show(); } else { loadingBar.setTitle("创建账号"); loadingBar.setMessage("请稍候,我们正在验证信息..."); loadingBar.setCanceledOnTouchOutside(false); loadingBar.show(); ValidatePhoneNumber(name, phone, password); } } private void ValidatePhoneNumber(String name, String phone, String password) { DatabaseReference RootRef = FirebaseDatabase.getInstance().getReference(); RootRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!(snapshot.child("Users").child(phone).exists())) { HashMap<String, Object> userdataMap = new HashMap<>(); userdataMap.put("phone", phone); userdataMap.put("password", password); userdataMap.put("name", name); RootRef.child("Users").child(phone).updateChildren(userdataMap) .addOnCompleteListener(task -> { if (task.isSuccessful()) { Toast.makeText(RegisterActivity.this, "恭喜您,账号创建成功!", Toast.LENGTH_SHORT).show(); loadingBar.dismiss(); Intent intent = new Intent(RegisterActivity.this, MainActivity.class); startActivity(intent); finish(); } else { loadingBar.dismiss(); Toast.makeText(RegisterActivity.this, "网络错误:请稍后重试...", Toast.LENGTH_SHORT).show(); } }); } else { Toast.makeText(RegisterActivity.this, "手机号 " + phone + " 已存在。", Toast.LENGTH_SHORT).show(); loadingBar.dismiss(); Toast.makeText(RegisterActivity.this, "请使用其他手机号重试。", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(RegisterActivity.this, MainActivity.class); startActivity(intent); finish(); } } @Override public void onCancelled(@NonNull DatabaseError error) { loadingBar.dismiss(); Toast.makeText(RegisterActivity.this, "请求被取消:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
内容的提问来源于stack exchange,提问作者user16694616
相关产品推荐
相关产品推荐

