FirebaseAuth登出在MenuActivity正常,ProfileActivity继承后崩溃求助
问题分析与修复方案
其实你的登出按钮功能本身没有问题,崩溃的根源是ProfileActivity中Firebase数据库监听的onCancelled方法里的Toast调用错误,和菜单继承逻辑无关。
错误原因解析
从Logcat日志可以定位到核心问题:
android.content.res.Resources$NotFoundException: String resource ID #0xfffffffd at android.widget.Toast.makeText(Toast.java:304) at com.example.myapplication.ProfileActivity$1.onCancelled(ProfileActivity.java:58)
databaseError.getCode()返回的是int类型的错误码(比如权限拒绝对应的错误码是-3,即十六进制的0xfffffffd),而Toast.makeText()的第二个参数如果传入int值,系统会默认把它当成字符串资源ID去查找对应的资源,但这个错误码并不是有效的资源ID,因此抛出了资源找不到的异常。
另外你还遗漏了调用Toast.show()方法,即便参数正确,Toast也不会正常显示。
修复步骤
修改ProfileActivity中onCancelled方法的Toast代码,把错误码转换成字符串类型,或者直接使用错误详情信息,并补充show()调用:
@Override public void onCancelled(@NonNull DatabaseError databaseError) { // 方案1:显示错误码(转为字符串) Toast.makeText(ProfileActivity.this, "数据库错误:" + databaseError.getCode(), Toast.LENGTH_SHORT).show(); // 方案2:显示详细错误信息(更便于调试) // Toast.makeText(ProfileActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show(); }
为什么看起来是登出按钮的问题?
当你点击登出按钮后,Firebase Auth执行signOut(),当前用户变为未登录状态,此时ProfileActivity中通过firebaseAuth.getUid()获取的数据库引用已经失去访问权限,数据库请求被拒绝,触发了onCancelled回调,而这个回调里的错误代码导致了崩溃,所以看起来像是登出按钮的问题,但实际是数据库错误处理代码的bug。
内容的提问来源于stack exchange,提问作者C. Martin
相关产品推荐
相关产品推荐

