HttpURLConnection连接速度很慢 - Java / Android

时间:2014-08-21 10:05:26

标签: java android httpurlconnection urlconnection

我希望在远程连接上获取文件的文件大小而不实际下载(大)文件。我正在使用" 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并且不会重复使用旧的URLConnection。可以重用连接帮助吗?

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

我可能不会调用disconnect,但我知道不建议这样做,因为资源不会被释放。这不正确吗?我注意到HttpURLConnection没有断开连接。建议关闭你打开的任何流。

此代码位于asynctask中。我想我可以尝试将断开调用本身移动到另一个asynctask,因为之后我什么也做不了。不确定是否可能。

你有什么建议吗?我应该尝试除{{1}}之外的其他内容来获取文件大小而不下载文件吗?

2 个答案:

答案 0 :(得分:1)

感谢EJP的评论。将请求方法更改为" HEAD"断开连接几乎是瞬间的:

conn.setRequestMethod("HEAD");

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

答案 1 :(得分:0)

我建议您使用VolleyOkhttp来加快网络速度,但这取决于您的要求。通过Comparison Of Volley And OkHttp and Retrofit 并决定使用哪个库。

如果您将此代码放入AsyncTask中,请阅读Dark Side of AsyncTask