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 に答える