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
相关产品推荐
相关产品推荐

