java - Android:URLConnection.getContentLength() 给出不正确的值

标签 java android android-asynctask urlconnection http-content-length

我正在尝试使用以下方法获取 URL 内容的大小:

URLConnection conn = null;
URL url = null;
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html");
conn = url.openConnection();
conn.connect();
InputStream in = new BufferedInputStream(url.openStream());
int fileSize = conn.getContentLength();
System.out.println("File size " + fileSize);
while (in.read() != -1) {
    i++;
}
in.close();
System.out.println("Read " + i + " bytes of a possible " + fileSize);

我在 AsyncTaskdoInBackground() 中使用它,出于某种原因 conn.getContentLength(); 正在返回 1273 当它应该返回 10136 时。

我在常规 Java 应用程序的 Main 中使用了上述代码,conn.getContentLength(); 返回了正确的 10136 值。

为什么它不能在 AsyncTask 中工作?

最佳答案

.getContentLength()的描述是返回Content-Length头字段的值。在一般情况下,这应该与可供读取的数据量相匹配。然而……

(1) 如果使用分块编码发送数据,则 header 可能不存在。在这种情况下,.getContentLength() 返回 -1,所以这里似乎不是这种情况。

(2) 默认情况下,HttpURLConnection 的实现请求服务器使用 gzip 压缩,它会自动为 getInputStream() 的调用者解压缩数据。在这种情况下,Content-Encoding 和 Content-Length 响应 header 被清除。

最后一句话似乎表明这里也不是这种情况,因为您没有从 .getContentLength()` 获得 -1,但相对大小 (1273/10136) 让我可疑的……

对此的一个测试是通过在请求 header 中设置可接受的编码来禁用 Gzip 编码:

urlConnection.setRequestProperty("Accept-Encoding", "identity");

另一种方法是“窥探”网络流量以观察 http header 和数据量以获取线索。

顺便说一句,url.openStream()url.openConnection().getInputStream() 提供了便利。

关于java - Android:URLConnection.getContentLength() 给出不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18634970/

相关文章:

android - 如何将base 64编码的字符串从android发送到wcf

android - 将辅助功能事件传递给后台线程获取空值

java - Lucene 的 AND/OR 问题

JavaScript 的类 Java 库/框架

java - 如何停用 SSL 验证?

java - 在 Spring Data Rest 响应中选择性地扩展关联

android - 如何在 Android 的自定义 View 上保存实例状态?

android - 如何访问 Google Maps android API v2 后台的位置更改?

java - 不收集 AsyncTasks 导致其他 AsyncTasks 不运行

android - onPostExecute 中的空指针异常