在某个项目单个设备调用接口20-30次后再次调用接口会抛出SocketException: Connection reset异常,每调用一次会抛出一次该异常,持续20秒左右后恢复可以继续正常调用接口。
原因:接口回调后会使用Glide加载一张路径404的图片导致的。
- 问题原因分析
(1)Glide 加载 404 图片的行为
当 Glide 加载一张路径返回 404 的图片时,它会尝试从网络下载该图片。
由于服务器返回 404 状态码,Glide 会认为这是一个失败的请求,但它仍然会占用一个网络连接。
如果频繁加载 404 图片,Glide 会不断发起网络请求,占用大量连接资源。
(2)连接池资源耗尽
Android 的网络请求(包括 Glide 的图片加载)默认使用 HTTP/HTTPS 连接池来管理连接。
每个连接在请求完成后需要被释放回连接池,以供后续请求使用。
如果 Glide 频繁加载 404 图片,会导致连接池中的连接被占用且无法及时释放(因为 404 请求可能没有正确处理连接关闭)。
当连接池中的连接被耗尽时,后续的接口调用无法获取可用连接,从而抛出 SocketException: Connection reset 异常。
(3)异常恢复的原因
连接池中的连接在一定时间后(通常是 20 秒左右)会被超时释放。
当连接被释放后,连接池中又有可用的连接,接口调用恢复正常。
解决方案
(1)避免加载 404 图片
在加载图片之前,先检查图片路径是否存在或有效。
如果图片路径可能返回 404,可以使用占位图或默认图替代。
(2)优化 Glide 的加载行为
使用 Glide 的 skipMemoryCache(true) 和 diskCacheStrategy(DiskCacheStrategy.NONE) 避免缓存无效的 404 图片。
(3)增加连接池容量
如果无法完全避免加载 404 图片,可以尝试增加 HTTP 连接池的容量,以减少连接耗尽的概率。
(4)捕获并处理异常
在接口调用时捕获 SocketException,并尝试重试或提示用户。总结
Glide 加载 404 图片时会占用网络连接资源,导致连接池耗尽,进而引发接口调用抛出 SocketException: Connection reset 异常。
解决方案包括避免加载 404 图片、优化 Glide 加载行为、增加连接池容量以及捕获和处理异常。
通过合理优化,可以避免该问题并提升应用的稳定性和性能。