85

java什么时候放弃与URL的连接?我在 URL 或 URLConnection 上都没有看到 close() 方法,所以它会在请求完成后立即释放连接吗?我主要是想看看我是否需要在异常处理程序中进行任何清理。

try {
  URL url = new URL("http://foo.bar");
  URLConnection conn = url.openConnection();
  // use the connection
}
catch (Exception e) {
  // any clean up here?
}
4

3 回答 3

54

如果您转换为 HttpURLConnection,则有一个disconnect()方法。如果连接空闲,它可能会立即断开连接。没有保证。

于 2008-11-07T17:53:00.433 回答
50

这取决于协议中指定的具体协议。一些保持持久连接,另一些在连接给定的输入或输出流中关闭呼叫时关闭它们的连接。但除了记住关闭从 URLConnection 打开的流之外,您无能为力。

来自 java.net.URLConnection 的 javadoc

在请求之后对 URLConnection 的 InputStream 或 OutputStream 调用 close() 方法可能会释放与此实例关联的网络资源,除非特定的协议规范为其指定了不同的行为。

于 2008-11-07T17:46:18.900 回答
-1

我不得不一次下载数百个文件并遇到问题。

您可以使用以下命令检查您的应用程序的打开描述符:

adb shell ps

在列表中找到您的应用程序 PID 并使用另一个命令:

adb shell run-as YOUR_PACKAGE_NAME ls -l  /proc/YOUR_PID/fd

我在通常的启动中看到大约 150 个打开的描述符。下载文件时有 700 多个。它们的数量仅在几分钟后才会减少,看起来 Android 在后台释放它们,而不是当你可以close在流中释放它们时。

所以我们不能确定连接何时真正关闭。

于 2021-12-10T13:20:59.953 回答