2012-04-24 11 views
1

Androidアプリケーションがあり、ダウンロードした気象データの進行状況バーを表示したいと思います。私は約5か所の天気予報を表示します。問題は、レスポンスヘッダーからContent-Lengthを取得する場合です。ログには常に-1が表示されます(つまり、URLConnection変数にフィールドが設定されていないことを意味します)。GoogleWeather APIからコンテンツの長さを取得できません

これは私が使用しているコードです:

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; 
     } 
    } 

を私は何ができますか?または、ダウンロードしたデータの進行状況を表示する別の方法がありますか?

答えて

1

多くの場合、ページやその他のファイルはContent-Lengthヘッダー(データの「チャンク」として送信されます)と一緒に配信されません。その場合、通常はブラウザにパーセンテージは表示されず、永続的なアニメーションバー( "// // // // //")が表示されます。

もちろん、サイトの平均応答時間を知り、クライアントの遅さを伝えているときはいつでも偽装することができます。

+1

あなたは私のupvoteを取得@VladimirVolodinこの特定のケースでは、Googleの天気は、実際にAPIのバグを指摘するために、Content-Lengthヘッダ –

+0

を返します。圧縮を無効にするのは良いことではありません。それはコンテンツの長さ-1を示していますか? –

2

問題はアンドロイドのHttpUrlConnection実装メカニズムにあります。ここではwhat the official documentation says

デフォルトでは、HttpURLConnectionのこの実装では、サーバーでgzip圧縮が使用されます。 getContentLength()は送信されたバイト数を返しますので、そのメソッドを使用して、読み取ることができるバイト数をgetInputStream()から予測することはできません。代わりに、そのストリームが使い果たされるまでストリームを読み取ります。read()が-1を返すとき。 Gzip圧縮は、リクエストヘッダに許容可能なエンコーディングを設定することで無効にすることができます。

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

関連する問題