首页 文章

HttpURLConnection连接速度很慢 - Java / Android

提问于
浏览
0

我想在远程连接上获取文件的文件大小而不实际下载(大)文件 . 我正在使用文件的“Content-Length” Headers . 相关代码是:

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 而不是重用旧的 . 可以重用连接帮助吗?

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

我可以不调用disconnect,但我知道不推荐它,因为资源不会被释放 . 这不正确吗?我注意到 URLConnection 没有断开连接 . 建议关闭您打开的任何流 .

这段代码在asynctask中 . 我想我可以尝试将断开调用本身移动到另一个asynctask,因为之后我什么都不做 . 不确定是否可能 .

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

2 回答

  • 0

    感谢EJP的评论 . 将请求方法更改为“HEAD”几乎可以立即断开连接:

    conn.setRequestMethod("HEAD");
    

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

  • 1

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

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

相关问题