当我使用我的应用程序时,我不断在 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 app:dependencies 来生成我的依赖关系树,这样我就可以确保不包含 OkHttp。不知怎的,我仍然看到这个日志行。我不明白这怎么可能。
有谁知道任何常见库可能已将此日志行从 OkHttp 库复制并粘贴到他们的库中?我搜索了其他依赖项的所有源代码,但没有在其中任何一个中找到类似的日志行。
这是否与 Android Studio 注入的新分析代码有关?请参阅本文了解更多信息。
更新:原来我的 Fresco 依赖项一定是使用系统提供的 OkHttp 或类似的东西。 @Selvin 评论说 Android 在内部使用它。无论如何,显然当 Fresco 在尝试加载图像时收到带有错误的 HTTP 响应(在我的例子中为 HTTP 响应代码 401)时,它会记录此错误。我没有看到任何使用 Fresco/OkHttp 处理 HTTP 错误的好方法。我用 Fresco 打开了以下问题:加载图像时的 HTTP 错误响应导致连接泄漏 #1983
我知道回复已经很晚了,但也许有人仍然对这个问题感到疯狂,最后我发现发生了什么事。是的:OkHttp 在内部使用HttpURLConnection/HttpsURLConnection从 Android 4.4 开始,您就可以在 logcat 中获取这些无聊的消息,即使您没有直接在项目中使用 OkHttp 库。
该问题是由两个因素产生的:
- urlConnection 对象重用套接字,试图
优化同一主机上多个请求的性能。
- 响应流没有正确关闭(见下文如何解决)
为了防止这些日志行或只是对流程进行更多控制,我对代码进行了一些更改,终于解决了这个问题.
- 我禁用了持久连接设置
Connection: close
标头。默认为Connection: keep-alive
- 在阅读响应的内容(主体)之前,请检查http响应代码。正如所描述的在本文中如果响应代码> = 400,则表示不成功:您不必读取连接InputStream
getInputStream()
但是错误流getErrorStream()
并通过调用关闭它.close()
右流上的方法。连接泄漏就在这里。终于记得disconnect()
urlConnection 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)