即使 OkHttp 不是依赖项,OkHttp 连接泄漏日志行也是如此

2023-11-30

当我使用我的应用程序时,我不断在 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 库。

该问题是由两个因素产生的:

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

为了防止这些日志行或只是对流程进行更多控制,我对代码进行了一些更改,终于解决了这个问题.

  • 我禁用了持久连接设置Connection: close标头。默认为Connection: keep-alive
  • 在阅读响应的内容(主体)之前,请检查http响应代码。正如所描述的在本文中如果响应代码> = 400,则表示不成功:您不必读取连接InputStreamgetInputStream()但是错误流getErrorStream()并通过调用关闭它.close()右流上的方法。连接泄漏就在这里。终于记得disconnect()urlConnection 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使 OkHttp 不是依赖项,OkHttp 连接泄漏日志行也是如此 的相关文章

  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • 由于现有相机用户,相机“0”的手电筒不可用

    我想创建一个应用程序 它有一个用于录制视频的按钮和另一个单独的切换按钮 用于在录制视频期间打开闪光灯 我已经使用camera2 API为最近的androids构建了相机应用程序 可以通过图像按钮访问 我将火炬模式设置为切换按钮 但这根本不起
  • 处理 SavedInstances 并恢复活动

    基本上我的应用程序有 2 个活动 说 A 和 B A 启动 B Activity B 播放音乐并且还有通知 情况 1 当视图仍在活动 B 上时 我按主页按钮 然后单击通知 活动 B 将打开 其视图完好无损并播放音乐 因为在清单中我使用 an
  • 单击另一个项目/小部件时展开/打开微调器?

    当用户单击另一个按钮时 我试图展开微调器 例如 我有一个带有值的微调器和一个 确定 按钮 当用户单击 确定 按钮而不从微调器中选择任何值时 微调器会自行扩展 是否可以在无需用户与微调器交互的情况下获得扩展微调器的事件 只需致电Spinner
  • 在android Gridview中合并行和列

    我正在android中做一个图像查看页面 我需要在某些地方合并行 在某些地方合并列 我们可以在gridview中做到这一点吗 如果我们选择任何合并图像 则应选择整个图像视图 请任何人告诉我一个建议 提前致谢 Try 非对称网格视图 http
  • Android 位置 API:获取提供商状态

    在 Android 中获取位置提供商状态的最佳方式是什么 当注册 LocationListener 以进行位置更新时 onStatusChanged String provider int status Bundle extras 每当状态
  • Android:将声音保存为铃声/SQLiteConstraintException

    我正在尝试使用 Android 将声音保存为铃声this http www stealthcopter com blog 2010 01 android saving a sound file to sd from resource and
  • 为什么我的地图视图上的叠加层没有显示?

    我按照 google hellomapview 教程中的说明进行操作 我得到了一个工作地图视图等 但是添加到地图中的两个项目没有显示 它们似乎在某个地方 因为点击指定位置会显示添加到项目中的消息 Edit 这是我的源代码 应该和google
  • eglCodecCommon:setVertexArrayObject:设置vao调试消息

    我的 Android Emulator API 28 logcat 被这样的消息搞得晕头转向 D eglCodecCommon setVertexArrayObject set vao to 1 1 0 0 D eglCodecCommon
  • Android:外部存储上的 mkdirs()/mkdir() 返回 false

    我对此感到疯狂 Log d STATE Environment getExternalStorageState File f new File Environment getExternalStoragePublicDirectory En
  • 如何告诉 OkHttpClient 忽略缓存并强制从服务器刷新?

    在我的 Android 应用程序中 我将 Retrofit 与 OkHttpClient 结合使用 并启用缓存来访问某些 API 我们的一些 API 有时会返回空数据 我们在应用程序中提供了一个 刷新 按钮 供客户端从特定 API 重新加载
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如何在 LazyColumn 底部添加空白区域?

    我想添加 LazyColumn 的空白底部 并且我想允许用户调出底部元素 我怎样才能实现这个 Example LazyColumn modifier Modifier fillMaxWidth height 300 dp border 2
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 解析 XML 标签不匹配时出错

  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12
  • Android:是否可以在可绘制选择器中使用字符串/枚举?

    问题 Q1 有人设法让自定义字符串 枚举属性在 xml 选择器中工作吗 我通过以下 1 获得了一个布尔属性 但不是字符串属性 编辑 感谢您的回答 目前 android 仅支持布尔选择器 原因请参阅已接受的答案 我计划实现一个复杂的自定义按钮
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客

随机推荐