[英]HttpURLConnection slow to disconnect - Java / Android
我想获取远程连接上文件的文件大小,而无需实际下载(大)文件。 我正在使用文件的“ 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信号很强,相对较快,而且使用笔记本电脑中的“卷曲”功能从来没有遇到这样的问题。 我也无法控制正在连接的Web服务器。
不确定是否一个接一个地建立到多个不同文件的多个相似连接时,该问题可能会得到增强。 但是,这是创建全新的HttpURLConnection
,而不是重用旧的。 可以重新使用连接帮助吗?
我从未真正下载文件或访问输入流。
我不能叫断开连接,但是我知道不建议这样做,因为不会释放资源。 这不正确吗? 我注意到URLConnection
没有断开连接。 建议您关闭所有打开的流。
这段代码在asynctask中。 我想我可以尝试将断开连接本身移动到另一个asynctask,因为之后我什么也不做。 不知道那是否有可能。
你有什么建议吗? 我应该尝试使用HttpURLConnection
以外的其他方法来获取文件大小而不下载文件吗?
感谢EJP的评论。 将请求方法更改为“ HEAD”使得断开几乎是瞬时的:
conn.setRequestMethod("HEAD");
根据我的阅读,如果尚未读取HttpURLConnection.disconnect()
它将跳过整个响应对象。 因此,对于非常大的文件,将需要很长时间。 使用请求方法“ HEAD”强制响应主体为空并解决问题。
我建议您使用Volley或Okhttp来加快网络速度,但要视您的要求而定。 通过对Volley和OkHttp和Retrofit进行比较,并确定要使用哪个库。
如果建议您将此代码放入AsyncTask中,请阅读AsyncTask的Dark Side 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.