OkHttp调用取消后能否读取响应体数据?拦截器场景相关问询
OkHttp请求取消后读取响应体及断点续传方案
请求被取消后能否读取响应体?
- 不行。调用
call.cancel()后,OkHttp会立即中断底层网络IO,释放相关资源,ResponseBody会被标记为已关闭。此时尝试读取响应体,会直接抛出IOException提示流已关闭,无法获取任何数据。
拦截器中取消后能否读取部分响应数据?
- 应用拦截器:要么拦截器根本不会执行(请求在到达拦截器前已取消),要么取消操作会直接关闭响应流,读取已接收数据的可能性极低,基本无法实现。
- 网络拦截器:由于更贴近底层网络层,如果取消时已有部分响应数据被缓存到OkHttp的内部缓冲区,有可能读取到这部分数据,但这完全依赖OkHttp的内部实现,不同版本行为可能不一致,而且无法保证能拿到完整的已传输字节,不建议依赖这种方式。
实现断点续传的可靠方案
如果目标是缓存已接收内容用于后续Range请求恢复下载,不要依赖取消后的读取逻辑,推荐这种更稳定的方式:
- 在网络拦截器中主动缓存数据:自定义包装
ResponseBody,在读取响应体的同时,将字节写入本地缓存文件。 - 取消下载时终止读取:当需要取消下载,停止读取响应体即可,此时本地缓存文件已经保存了已接收的全部字节。
- 恢复下载时发起Range请求:检查服务器是否支持Range(响应头包含
Accept-Ranges: bytes),然后在新请求中添加Range: bytes=已缓存字节数-的请求头,获取剩余部分数据后合并到缓存文件。
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

