OkHttp中response.close()与response.body.close()的区别及关闭方式选择
OkHttp 响应关闭的正确姿势:避免内存泄漏
直接给结论:优先调用 response.close(),这是OkHttp官方设计的统一关闭入口,能一次性释放整个响应链路的所有资源,完全不用你手动去关body、缓存响应这些零散的部分。
下面给你拆解各个方法的区别:
response.close():这是最省心的方式,它会递归关闭当前响应的body、cacheResponse、networkResponse里的所有关联资源,把整个请求链路的网络连接、流都彻底释放,从根源避免内存泄漏。response.body().close():仅关闭当前响应的body流,但如果响应存在缓存响应或网络响应的关联body,这些资源不会被关闭,可能残留未释放的连接,有泄漏风险。response.peekBody(Int).close():peekBody返回的是原body的一个独立副本,关闭它只是清理这个副本的资源,和原响应的资源没关系,一般是预览body内容后用来清理临时副本用的。response.cacheResponse().close()/response.networkResponse().close():这俩是单独关闭缓存响应或网络响应的body,完全没必要手动调用——response.close()已经帮你处理了这些嵌套的响应资源。
额外提一句:如果已经完整读取了body内容(比如用response.body().string()),OkHttp会自动关闭body流,但如果读取过程中断(比如只读了一半就抛出异常),必须手动调用response.close()来释放资源,这时候用顶层的close是最稳妥的选择。
内容的提问来源于stack exchange,提问作者SMBiggs
相关产品推荐
相关产品推荐

