在使用我的应用程序时,我一直在Logcat中看到以下日志行:
19098-19147/<package> W/OkHttpClient: A connection to <my server> was leaked. Did you forget to close a response body?
我对这个bug进行了一些研究,发现当你做了一些事情,比如忘记在拦截器中关闭一个响应体时,就会发生这种情况。我评论了所有拦截器,看看其中一个是否导致了这个问题,但我仍然看到了日志行。我最终评论了OkHttp的所有用途,但我仍然以某种方式得到了错误。我甚至从我的Gradle文件中删除了所有OkHttp依赖项,并添加了一个显式行,以确保它被排除为传递依赖项。我运行了gradle app:dependencies以生成我的依赖树,所以我可以确保没有包含OkHttp。不知怎的,我仍然看到这个日志行。我不明白这是怎么回事。
有没有人知道任何可能已将此日志行复制并粘贴到OkHttp库并进入他们的公共库?我搜索了其他依赖项的所有源代码,但没有找到任何相似的日志行。
这可能与Android Studio注入的新配置代码有关吗? See this article for more information.
更新:原来我的Fresco依赖必须使用系统提供的OkHttp或类似的东西。 @Selvin评论说Android在内部使用它。无论如何,显然当Fresco在尝试加载图像时收到带有错误的HTTP响应(在我的情况下是HTTP响应代码401)时,它会记录此错误。我没有看到使用Fresco / OkHttp处理HTTP错误的任何好方法。我用Fresco打开了以下问题:HTTP error response when loading image results in leaked connection #1983
答案 0 :(得分:0)
我知道这是很晚的回复,但是也许有人仍然对此问题感到疯狂,最后我才知道发生了什么。是的:自Android 4.4开始,OkHttp在 HttpURLConnection / HttpsURLConnection 组件内部使用,因此即使您没有在项目中直接使用OkHttp库,也可以在logcat中获取这些无聊的消息。
该问题是由两个因素引起的:
为防止出现这些日志行或仅对流进行更多控制,我对代码进行了一些更改,并最终解决了此问题。
Connection: close
标头。默认值为Connection: keep-alive
getInputStream()
连接,而是要读取ErrorStream getErrorStream()
并通过调用{{1 }}方法。连接泄漏在这里。最后,请记住.close()
urlConnection对象。