我有一个使用OkHttp的Android SDK。在我使用我的SDK的示例应用程序中,一切正常。但是,我的一位用户在启用StrictMode时获得以下java.lang.Throwable: Explicit termination method 'close' not called
。我已经尝试在我自己的应用程序中使用StrictMode复制它,并且不会出现此错误。
我知道我应该打电话给response.body().close()
,但我仍然对我的应用中没有发生这种情况的原因感到困惑。他发给我的堆栈跟踪只有我的类,所以看起来他的代码中的任何内容都不会导致它。
另外值得注意的是,我的SDK中只有一个请求实际上已经读取了响应。但这不是我的用户所说的引起异常的请求。
还有什么可能导致这个吗?
我应该何时致电.close()
?在调用execute()
之后立即调用它是否可取?关闭身体是否会阻止它在将来被阅读?
答案 0 :(得分:10)
您应该始终致电close()
。来自OkHttp's source:
来电者可以使用回复
Response.body()
方法阅读回复正文。为了便于连接回收,呼叫者应始终关闭响应主体。
您应该在完成从响应中获得所需内容后立即致电close()
。将其存储在变量中,然后关闭ResponseBody
。