gpt4 book ai didi

android - OkHttp 连接泄漏日志行,即使 OkHttp 不是依赖项

转载 作者:行者123 更新时间:2023-12-05 07:38:45 32 4
gpt4 key购买 nike

我在使用我的应用程序时不断在 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。不知何故,我仍然看到这个日志行。我不明白这怎么可能。

有谁知道任何公共(public)库可能已将此日志行从 OkHttp 库复制并粘贴到他们的库中?我搜索了我其他依赖项的所有源代码,但没有在其中任何一个中找到类似的日志行。

这可能与 Android Studio 注入(inject)的新分析代码有关吗? 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

最佳答案

我知道这是很晚的回应,但也许有人还在为这个问题发疯,最后我发现了发生了什么。是的:自 Android 4.4 起,OkHttp 在 HttpURLConnection/HttpsURLConnection 组件内部使用,因此即使您没有在项目中直接使用 OkHttp 库,您也可以在 logcat 中获取这些无聊的消息。

问题是由两个因素引起的:

  1. 套接字被 urlConnection 对象重用,试图优化同一主机上多个请求的性能。
  2. 响应流没有正确关闭(见下文如何解决)

为了防止出现这些日志行或只是更好地控制流程,我对代码进行了一些更改,最终解决了这个问题

  • 我禁用了持久连接设置 Connection: close header 。默认为 Connection: keep-alive
  • 在阅读响应的内容(正文)之前,检查 http 响应代码。正如描述的那样in this article如果响应代码为 >= 400,则表示失败:您不必读取连接 InputStream getInputStream(),而是读取 ErrorStream getErrorStream() 并通过调用 关闭它code>.close() 右侧流上的方法。连接泄漏就在这里。最后记得 disconnect() urlConnection 对象。

关于android - OkHttp 连接泄漏日志行,即使 OkHttp 不是依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666053/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com