我希望在远程连接上获取文件的文件大小而不实际下载(大)文件。我正在使用" 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}}之外的其他内容来获取文件大小而不下载文件吗?
答案 0 :(得分:1)
感谢EJP的评论。将请求方法更改为" HEAD"断开连接几乎是瞬间的:
conn.setRequestMethod("HEAD");
根据我的阅读,HttpURLConnection.disconnect()
将跳过整个响应对象(如果尚未阅读)。因此,对于非常大的文件,需要很长时间。使用请求方法" HEAD"强迫反应机构为空并解决问题。
答案 1 :(得分:0)
我建议您使用Volley或Okhttp来加快网络速度,但这取决于您的要求。通过Comparison Of Volley And OkHttp and Retrofit 并决定使用哪个库。
如果您将此代码放入AsyncTask中,请阅读Dark Side of AsyncTask。