无网络时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
相关产品推荐
相关产品推荐

