You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Realtime Database真机异常:点击按钮直接进入finally块

问题描述

以下是按钮点击事件的核心代码:

binding.btSave.setOnClickListener {
        val firstName = binding.etFirstName.text.toString()
        val lastName = binding.etLastName.text.toString()
        val age = binding.etAge.text.toString()
        val userName = binding.etUserName.text.toString()

        if (firstName.isNotEmpty() && age.isNotEmpty() && lastName.isNotEmpty() && userName.isNotEmpty()) {

            try {

                database =
                    FirebaseDatabase.getInstance("My Url")
                        .getReference("Users")

                val users = User(firstName, lastName, age, userName)

                database.child(userName).setValue(users).addOnSuccessListener {

                    binding.etAge.text.clear()
                    binding.etFirstName.text.clear()
                    binding.etLastName.text.clear()
                    binding.etUserName.text.clear()

                    Toast.makeText(this, "Successfully added", Toast.LENGTH_SHORT).show()

                }.addOnFailureListener {

                    Toast.makeText(this, it.message, Toast.LENGTH_SHORT).show()

                }

            } catch (e: Exception) {

                Toast.makeText(this, e.message, Toast.LENGTH_LONG).show()

            } finally {
                Toast.makeText(this, "finished", Toast.LENGTH_SHORT).show()

            }
        }
    }

真机点击按钮时会直接进入finally块,模拟器运行完全正常;已为应用授予网络权限和网络状态权限,且Firebase Authentication功能运行正常,求解决办法。


排查与解决步骤
  • 先明确执行逻辑:finally块必然执行
    无论try块代码是正常执行、抛出异常,还是异步操作未完成,finally块都会触发。你看到的“直接进入finally”是正常执行顺序,真正的问题大概率是try块内抛出了未被Toast正确提示的异常,或者Firebase的异步操作因网络/配置问题未触发回调。

  • 优先捕获真实异常信息
    真机上Toast可能因系统限制无法正常显示,给catch块添加日志打印,精准定位异常:

    catch (e: Exception) {
        Log.e("FirebaseDBError", "数据写入异常", e)
        Toast.makeText(this, e.message, Toast.LENGTH_LONG).show()
    }
    

    常见真机异常场景:

    • Firebase实时数据库URL配置错误:检查"My Url"是否为控制台提供的完整HTTPS地址,真机对域名解析的容错性更低。
    • User类序列化失败:确保User类有默认无参构造函数,所有字段为public或提供getter方法(Firebase依赖反射完成对象序列化)。
    • 签名指纹未配置:真机调试使用的签名文件SHA-1未添加到Firebase控制台,导致服务鉴权失败。
  • 排查网络与系统限制

    • 切换网络环境:尝试用手机流量替代WiFi,排除局域网防火墙/代理拦截。
    • 处理明文HTTP限制:如果数据库URL是HTTP协议,在AndroidManifest.xml的<application>标签添加android:usesCleartextTraffic="true",建议优先改用HTTPS地址。
    • 检查系统权限:除了网络权限,确认真机已授予应用“后台联网”权限(部分国产ROM会默认限制)。
  • 验证Firebase服务连通性
    打开Firebase控制台的实时数据库监控面板,查看是否有来自真机的请求记录;如果没有请求到达,说明设备与Firebase服务器的连接存在问题,需重点排查网络配置或鉴权信息。


内容的提问来源于stack exchange,提问作者mohammad mahdi ranjbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:27:30