1

我有一个 Android 应用程序,我想显示下载的天气数据的进度条。我将显示大约 5 个地方的天气预报。问题是当我想从响应头中获取 Content-Length 时。日志总是显示-1(这意味着该字段未在 URLConnection 变量中设置)。

这是我正在使用的代码:

private class DownloadWeatherData extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... sUrl) {
            try {
                URL url = new URL("http://www.google.com/ig/api?weather=NY&hl=en&oe=utf-8");
                URLConnection connection = url.openConnection();

                int dataLenght = connection.getContentLength();
                Log.d("ANDRO_ASYNC", "Data lenght: " + dataLenght);

                InputStream input = new BufferedInputStream(url.openStream());

                byte data[] = new byte[1024];
                long total = 0;
                int count;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    Log.d("ANDRO_ASYNC", ""+(int)((count)));
                }
                input.close();
            } catch (Exception e) {
            }
            return null;
        }
    }

我能做些什么?还是有其他方法可以显示下载数据的进度?

4

2 回答 2

2

问题出在android的HttpUrlConnection实现机制上。这是官方文档所说的

默认情况下,这种实现HttpURLConnection请求的服务器使用 gzip 压缩。由于getContentLength()返回传输的字节数,因此您无法使用该方法来预测可以从中读取多少字节getInputStream()。相反,读取该流直到它用尽:whenread()返回 -1。可以通过在请求标头中设置可接受的编码来禁用 Gzip 压缩:

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

于 2012-04-24T10:17:51.393 回答
1

页面和其他文件通常不带有 Content-Length 标头(作为“数据块”发送)。在这种情况下,通常浏览器不会显示百分比,而是显示一个永久动画栏(“ // // // // //”)。

当然,当您知道站点的平均响应时间和客户端的传输速度时,您总是可以伪造它。

于 2012-04-24T09:18:52.157 回答