繁体   English   中英

HttpURLConnection缓慢断开连接-Java / Android

[英]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”强制响应主体为空并解决问题。

我建议您使用VolleyOkhttp来加快网络速度,但要视您的要求而定。 通过对Volley和OkHttp和Retrofit进行比较,并确定要使用哪个库。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM