Windows平台Android Studio模拟器使用Retrofit+OkHttp出现unexpected end of stream报错
问题根因
该问题和OkHttp、Retrofit、服务端配置均无关,是Windows平台的Android Studio官方模拟器自带的网络栈实现BUG,仅在Windows系统运行官方模拟器时触发,Mac/Linux版模拟器、真机、其他HTTP客户端均不会复现该问题。你此前尝试的修改请求头、调整超时、修改连接池配置、调整服务端响应头等操作都无法解决问题,因为这些操作都是针对HTTP协议层的优化,无法修复模拟器底层网络栈的缓冲区数据丢失缺陷。
可行解决方案
- 方案1:开发调试阶段若无需使用OkHttp的自定义拦截器、超时配置等扩展功能,直接移除Retrofit构造时的
.client(client)配置即可解决问题,使用Retrofit默认生成的OkHttpClient即可避开该BUG。 - 方案2:如果必须保留自定义OkHttpClient配置,可新增一个全局拦截器,一次性读取完整响应体后再封装返回,避免分块读取时出现字符丢失问题,示例代码如下:
val fullBodyInterceptor = Interceptor { chain -> val originalResponse = chain.proceed(chain.request()) val fullBody = originalResponse.body?.bytes()?.let { ResponseBody.create(originalResponse.body?.contentType(), it) } originalResponse.newBuilder() .body(fullBody) .build() } // 把这个拦截器添加到OkHttpClient的拦截器列表最前面 val client = OkHttpClient.Builder() .addInterceptor(fullBodyInterceptor) // 保留其他原有配置 .build()
- 方案3:调试阶段直接使用物理真机,或者Genymotion等第三方模拟器,完全避开官方Windows模拟器的网络缺陷。
- 生产环境无需做额外适配:该问题仅存在于Windows版的Android Studio官方开发模拟器,真实用户的安卓设备不会触发该问题,不会影响线上用户使用。
内容的提问来源于stack exchange,提问作者Vind Iskald
相关产品推荐
相关产品推荐

