【问题标题】:HttpURLConnection slow to disconnect - Java / AndroidHttpURLConnection 断开连接缓慢 - Java / Android
【发布时间】:2014-08-21 10:05:25
【问题描述】:

我想在不实际下载(大)文件的情况下获取远程连接上文件的文件大小。我正在使用文件的“Content-Length”标头。相关代码为:

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秒!诚然,这是连接到运行 Web 服务器的辅助本地设备,但 WiFi 信号很强,速度相对较快,而且我从未在笔记本电脑上使用“curl”时遇到过任何此类问题。我也无法控制我正在连接的网络服务器。

当多个类似的连接一个接一个地连接到不同的文件时,这个问题可能会增强,不确定。然而,这是创建全新的HttpURLConnection,而不是重用旧的。重用连接有帮助吗?

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

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

此代码位于异步任务中。我想我可以尝试将断开连接调用本身移动到另一个异步任务,因为之后我什么都不做。不确定这是否可能。

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

【问题讨论】:

  • 我建议你将请求方法更改为“HEAD”。否则,您可能正在阅读整个 GET 响应,即整个文件。

标签: java android httpurlconnection urlconnection


【解决方案1】:

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

conn.setRequestMethod("HEAD");

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

【讨论】:

    【解决方案2】:

    我建议您使用VolleyOkhttp 以获得更快的网络,但取决于您的要求。通过Comparison Of Volley And OkHttp and Retrofit 并决定使用哪个库。

    作为建议,如果您将此代码放入 AsyncTask 中,然后阅读 Dark Side of AsyncTask

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多