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

无网络时FirebaseNetworkException致App崩溃,try-catch未生效排查

问题分析与解决

你的try-catch无法捕获FirebaseNetworkException的核心原因是:getIdToken()是异步操作,它的回调addOnCompleteListener运行在独立的线程中,外层的try-catch无法覆盖这个异步回调的执行上下文。当网络异常发生时,异常是在回调线程中抛出的,外层的try-catch根本抓不到。

修复方案

你需要在addOnCompleteListener内部检查任务是否执行成功,直接在回调里处理异常,同时要确保无论成功还是失败,都调用countDownLatch.countDown(),避免线程一直阻塞。

修改后的代码如下:

fun getToken(): String? {
    val token = StringBuilder()
    val countDownLatch = CountDownLatch(1)
    
    FirebaseAuth.getInstance().currentUser?.getIdToken(false)
        ?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                token.append(task.result?.token)
                println(task.result?.token)
            } else {
                // 处理异步任务抛出的异常
                val exception = task.exception
                if (exception is FirebaseNetworkException) {
                    println("exception is ${exception.message}")
                }
                // 其他异常也可以在这里扩展处理
            }
            // 无论成功失败都要触发倒计时,避免线程阻塞
            countDownLatch.countDown()
        }
    
    return try {
        countDownLatch.await(30L, TimeUnit.SECONDS)
        // 空token返回null,避免返回空字符串
        token.takeIf { it.isNotEmpty() }?.toString() ?: null
    } catch (ie: InterruptedException) {
        null
    }
}

关键说明

  • 异步操作的异常必须在其回调内部处理,外层的同步try-catch无法捕获异步线程的异常。
  • 必须保证countDownLatch.countDown()在所有分支都被调用,否则await会一直阻塞直到超时,甚至引发其他线程问题。

内容的提问来源于stack exchange,提问作者Siqueler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:25:33