即使OKHTTP不是依赖关系,OKHTTP连接泄漏日志行



我在使用应用程序时一直在logcat中看到以下日志行:

19098-19147/<package> W/OkHttpClient: A connection to <my server> was leaked. Did you forget to close a response body?

我对这个错误进行了一些研究,发现当您做诸如忘记关闭拦截器中的响应主体之类的事情时,它可能会发生。我评论了所有拦截器,看看其中一个是否引起了这个问题,但我仍然看到了日志线。我最终评论了Okhttp的所有用途,但我仍然以某种方式遇到了错误。我什至甚至从我的gradle文件中删除了所有OKHTTP依赖项,并添加了一条明确的行,以确保将其排除在于传递依赖性。我运行了Gradle应用程序:依赖关系以生成我的依赖树,以便我可以确保不包括OKHTTP。不知何故,我仍在看到此日志线。我不明白这是怎么可能的。

有人知道是否有任何常见的库可能复制并粘贴了从Okhttp库中并粘贴到其库中?我搜索了其他依赖项的所有源代码,但在其中任何一个中都没有找到类似的日志行。

这与Android Studio注入的新概要码有关系吗?有关更多信息,请参见本文。

更新:事实证明,我的壁画依赖性一定是在使用系统提供的OKHTTP或类似的东西。@Selvin评论说,Android在内部使用它。无论如何,显然,当Fresco在尝试加载图像时带有错误的HTTP响应(在我的情况下,HTTP响应代码401)时,它会记录此错误。我看不到使用壁画/OKHTTP处理HTTP错误的任何好方法。我打开了壁画:加载图像时HTTP错误响应的以下问题导致泄漏连接#1983

我知道这是很晚的回复,但也许有人仍然对这个问题感到疯狂,最后我发现了发生了什么。是:OKHTTP在> httpurlConnection/httpsurlConnection 组件中内部用于内部,因为Android 4.4自android 4.4以来,即使您不直接在项目中直接使用OKHTTP库,也可以在LogCat中获取这些无聊的消息。

问题由2个因素产生:

  1. 插座由urlconnection对象重复使用,试图在同一主机上的多个请求上选择表演。
  2. 响应流未正确关闭(请参见下面的解决方法)

为了防止这些日志线,或者简单地控制流程,我对我的代码进行了一些更改,最终解决了此问题

  • i禁用持续连接设置Connection: close标头。默认值为Connection: keep-alive
  • 在阅读响应的内容(正文)之前,请检查HTTP响应代码。在本文中有很好的描述,如果响应代码> = 400,您会遇到一个失败:您必须读取连接InputStream getInputStream(),而是错误的getErrorStream(),并通过在右流上调用.close()方法将其关闭。连接泄漏在这里。最后记住要 disconnect() urlconnection对象。

最新更新