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

Android中如何通过OkHttp3判断API请求响应阶段的网络断开?

判断OkHttp3请求因中途网络断开失败的方法

OkHttp 并没有提供专门标识“等待响应时网络断开”的官方字段,但你可以通过捕获并分析 IOException 及其子类、结合错误信息来定位这类问题。

核心判断逻辑

在请求失败的回调(比如 enqueue() 的 onFailure() 方法)中,对抛出的 Throwable 进行如下判断:

  • 首先确认异常属于 IOException 体系:网络相关的错误几乎都会抛出这类异常
  • 进一步区分具体场景:
    • SocketTimeoutException:如果请求发起后断网,没有任何响应返回,通常会触发超时异常,这是最常见的中途断网表现
    • SocketException:查看错误信息是否包含 "Connection reset"、"Network is unreachable" 等关键词,这类信息基本对应网络连接中途被切断的情况
    • ConnectException:虽然更多是发起连接时的问题,但部分场景下中途断网也可能触发该异常

代码示例

val okHttpClient = OkHttpClient()
val request = Request.Builder()
    .url("https://your-target-api.com")
    .build()

okHttpClient.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        when (e) {
            is SocketTimeoutException -> {
                // 大概率是中途断网导致请求超时无响应
                println("请求超时,可能是中途网络断开")
            }
            is SocketException -> {
                val isNetworkDisconnected = e.message?.run {
                    contains("Connection reset") || contains("Network is unreachable")
                } ?: false
                if (isNetworkDisconnected) {
                    println("网络中途断开,请求失败")
                } else {
                    println("Socket异常:${e.message}")
                }
            }
            else -> {
                // 其他IO类错误,比如DNS解析失败、服务器拒绝连接等
                println("其他网络错误:${e.message}")
            }
        }
    }

    override fun onResponse(call: Call, response: Response) {
        // 处理成功响应
        response.use {
            // ...
        }
    }
})

注意事项

  • Response 类仅在请求成功拿到服务端响应时才会返回,网络失败场景不会进入 onResponse(),所以所有网络错误判断都要在 onFailure() 中处理
  • 没有100%精准的“中途断网”判断,不同设备、网络环境抛出的异常可能略有差异,建议结合异常类型和关键词做双重校验

内容的提问来源于stack exchange,提问作者Vinh Hung Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:20:21