更新: 自分で答えを見つけました、以下を見てください:-)
こんにちは、
私は現在、AndroidアプリをバックグラウンドでHTTP PostとAsyncTaskを使用して送信するアプリをコーディングしています。これには org.Apache.http.client パッケージを使用します。私のコードは この例 に基づいています。
基本的に、私のコードは次のようになります。
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
問題は、 httpclient.execute(..)行に1.5〜3秒ほどかかります、そして私はその理由がわかりません。 HTTP Getを使用してページを要求するだけで約80ミリ秒かかるため、問題はネットワーク遅延自体ではないようです。
問題はサーバー側にもあるようではなく、データをPOSTして http://www.disney.com/ にしてみたところ、結果は同じように遅くなりました。また、Firebugは、サーバーにローカルでデータをPOSTすると1 msの応答時間を示します。
これはエミュレーターと私のNexus Oneで起こります(両方ともAndroid 2.2)で)。
完全なコードを確認したい場合は、 GitHub に配置しました。
ボタンのプッシュでAsyncTaskを使用してバックグラウンドでHTTP Postを実行するのは、単なるダミープログラムです。それは私の最初のAndroidアプリ、そして私の最初のJava長い間コードです。そして、偶然にも、Stackoverflowに関する私の最初の質問です;-)
Httpclient.execute(httppost)に長い時間がかかる理由はありますか?
よし、もう少し調べて自分で解決した。次のように、HTTPバージョンを1.1に設定するパラメーターを追加するだけで済みました。
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
And-bookwormからの非常に素晴らしい HttpHelper Class と、試行錯誤のおかげで、これを見つけました。
私が正しく覚えている場合、HTTP 1.0はすべての要求に対して新しいTCP接続を開きます。これは大きな遅延を説明していますか?
HTTP POSTリクエストは、WLANで50〜150ミリ秒、3Gで300〜500ミリ秒かかるようになりました。
私はAndroidを使用していませんが、httpclient 4.0.1を使用してWindowsプラットフォームでまったく同じ種類の問題に直面しました。
HttpParams params = new BasicHttpParams();
//this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse;
HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
StringEntity entity = new StringEntity(content, "utf-8");
entity.setContentType("text/plain; charset=utf-8");
httpPost.setEntity(entity);
httpResponse=httpClient.execute(httpPost);
String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
httpResponse.getEntity().consumeContent();
httpClient.getConnectionManager().shutdown();
return(response);
hTTP1.1バージョンでパラメーターを設定すると問題が解決する理由がわかりません。しかしそうです。さらに奇妙なことですが、HTTP Getリクエストを実行しても症状は表示されませんでした。
とにかく、私はこれがそこに役立つことを願っています!
h