Firebase登录卡顿+NullPointerException+GmsCore错误求助(Java新手)
Java Firebase登录页面:弹窗持续显示+NullPointerException+Invalid GmsCore APK问题
问题概述
- 点击登录按钮后,页面一直显示「Please waiting」弹窗,无法跳转至首页,同时触发NullPointerException;
- 出现「Invalid GmsCore APK」提示:远程加载已禁用,缺少Google Play Store,Firebase对象访问触发空指针异常。
相关资源
Realtime Database截图

SignIn页面代码
package com.example.eatit_new; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import com.example.eatit_new.Common.Common; import com.example.eatit_new.Model.User; import com.google.android.material.snackbar.Snackbar; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; import com.example.eatit_new.databinding.ActivitySignInBinding; 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 com.rengwuxian.materialedittext.MaterialEditText; public class SignIn extends AppCompatActivity { EditText editPhone, editPassword; Button btnSignIn; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_sign_in); editPassword=(MaterialEditText)findViewById(R.id.editPassword); editPhone= (MaterialEditText)findViewById(R.id.editPhone); btnSignIn = (Button) findViewById(R.id.btnSignIn); //init Database final FirebaseDatabase database= FirebaseDatabase.getInstance(); final DatabaseReference table_user=database.getReference("User"); btnSignIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final ProgressDialog mDialog = new ProgressDialog(SignIn.this); mDialog.setMessage("Please waiting...."); mDialog.show(); table_user.addValueEventListener( new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { //Check if user not exist in database if (dataSnapshot.child(editPhone.getText().toString()).exists()) { //Get User Information mDialog.dismiss(); User user = dataSnapshot.child(editPhone.getText().toString()).getValue(User.class); if (user.getPassword().equals(editPassword.getText().toString())) { Intent homeIntent= new Intent(SignIn.this,Home.class); Common.currentUser= user; startActivity(homeIntent); finish(); } else { Toast.makeText(SignIn.this, "Wrong password!", Toast.LENGTH_SHORT).show(); } } else { mDialog.dismiss(); Toast.makeText(SignIn.this, "User not exists!", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } }); } }
User类代码
package com.example.eatit_new.Model; public class User { String name; String password; public User() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String name, String password) { this.name = name; this.password = password; } }
附加截图


报错截图

解决方案
一、解决「Invalid GmsCore APK」与Firebase空指针问题
Firebase依赖Google Play Services运行,该提示说明测试设备缺少相关服务:
- 若使用模拟器:创建带Google Play服务的镜像(选择「Google APIs」或「Google Play」类型的系统镜像),不要使用纯Android原生镜像;
- 若使用真机:确保设备安装了Google Play Store,且Google Play Services为最新版本;
- 检查项目依赖:确认Module级
build.gradle中添加了必要依赖,同步后重新运行:implementation 'com.google.firebase:firebase-database:20.3.0' implementation 'com.google.android.gms:play-services-base:18.2.0'
二、解决弹窗持续显示+NullPointerException问题
空指针大概率因user对象为空、输入框文本为空,或未处理数据库请求失败导致,按以下步骤修改:
- 添加空值校验:在获取用户数据前校验输入合法性,获取后校验对象不为空:
修改onDataChange方法:@Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { String phone = editPhone.getText().toString().trim(); String password = editPassword.getText().toString().trim(); if (phone.isEmpty() || password.isEmpty()) { mDialog.dismiss(); Toast.makeText(SignIn.this, "请输入手机号和密码", Toast.LENGTH_SHORT).show(); return; } if (dataSnapshot.child(phone).exists()) { mDialog.dismiss(); User user = dataSnapshot.child(phone).getValue(User.class); if (user != null) { if (user.getPassword().equals(password)) { Intent homeIntent= new Intent(SignIn.this,Home.class); Common.currentUser= user; startActivity(homeIntent); finish(); } else { Toast.makeText(SignIn.this, "密码错误!", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(SignIn.this, "用户数据加载失败", Toast.LENGTH_SHORT).show(); } } else { mDialog.dismiss(); Toast.makeText(SignIn.this, "用户不存在!", Toast.LENGTH_SHORT).show(); } } - 处理
onCancelled回调:数据库请求失败时关闭弹窗并提示,避免弹窗一直显示:@Override public void onCancelled(@NonNull DatabaseError databaseError) { mDialog.dismiss(); Toast.makeText(SignIn.this, "数据库请求失败:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } - 改用单次数据监听:登录只需一次性获取数据,替换
addValueEventListener为addListenerForSingleValueEvent,避免不必要的持续监听:table_user.addListenerForSingleValueEvent(new ValueEventListener() { // 内部方法同上修改 });
内容的提问来源于stack exchange,提问作者Đoàn Thanh Thảo
相关产品推荐
相关产品推荐

