java - HttpURLConnection 断开连接缓慢 - Java/Android

标签 java android httpurlconnection urlconnection

我想获取远程连接上文件的文件大小,而无需实际下载(大)文件。我正在使用文件的“Content-Length” header 。相关代码为:

URL obj = new URL(FILES_URL + fileName);

String contentLength = "";
HttpURLConnection conn = null;

try {
    conn = (HttpURLConnection) obj.openConnection();
    conn.setConnectTimeout(3000);
    conn.setReadTimeout(3000);
    contentLength = conn.getHeaderField("Content-Length");
    int responseCode = conn.getResponseCode();
    Log.d(TAG, "responseCode: " + responseCode);
} finally {
    Log.d(TAG, "pre-disconnect");
    if (conn!=null) conn.disconnect();
    Log.d(TAG, "post-disconnect");
}

return contentLength;

命令“conn.disconnect();”有时似乎需要永远。我看了23秒!诚然,这是连接到运行网络服务器的辅助本地设备,但 WiFi 信号很强,速度相对较快,而且我在笔记本电脑上使用“curl”时从未遇到过任何此类问题。我也无法控制我正在连接的网络服务器。

当相继对不同的文件进行多个相似的连接时,该问题可能会加剧,但不确定。然而,这是创建全新的HttpURLConnection,而不是重用旧的。重用连接有帮助吗?

我从未真正下载过文件或访问输入流。

我可以不调用断开连接,但我知道不建议这样做,因为资源不会被释放。这不正确吗?我注意到 URLConnection 没有断开连接。只是建议关闭您打开的所有流。

此代码位于异步任务中。我想我可以尝试将断开连接调用本身移至另一个异步任务,因为之后我不执行任何操作。不确定这是否可能。

你有什么建议吗?我是否应该尝试 HttpURLConnection 以外的其他方法来获取文件大小而不下载文件?

最佳答案

感谢评论中的 EJP。将请求方法更改为“HEAD”使断开连接几乎是瞬时的:

conn.setRequestMethod("HEAD");

据我所知,如果尚未读取,HttpURLConnection.disconnect() 将跳过整个响应对象。因此,对于非常大的文件,需要很长时间。使用请求方法“HEAD”强制响应正文为空并解决问题。

关于java - HttpURLConnection 断开连接缓慢 - Java/Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423546/

相关文章:

java - 在 fragment 中使用 CoordinatorLayout 和 TabsLayout,在封闭的 Activity 中使用 NavigationDrawer

java - 在 scala 中处理 csv

android - 创建 buildSrc 和 build.gradle.kts 时出现此错误的新 Android Studio 4.2 Preview

android - 如何调整 Android 位图中图像的大小?

java - 如何使用 HttpURLConnection 在 Android 中的 url 末尾添加 json 数组?

java - 如何使用 jackson 将 java 对象序列化为 xml 属性?

java - 如果我们知道它的一个变量或参数,如何访问对象?

java - 如何使我的 AlertDialog 标题居中?

java - 使用服务器缓存 15 分钟

java - 处理 GET 请求 - Apache HttpClient 与 java.net.HttpURLConnection