4

専用サーバーでホストされているphpファイルにいくつかの投稿値を送信し、配列結果を保存するAndroidアプリをコーディングしようとしています

コードはこれです

   HttpPost httppost;
    DefaultHttpClient httpclient;

    httppost = new HttpPost("http://IP/script.php"); 
    HttpParams param = new BasicHttpParams(); 
    param.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);


  //  httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

    HttpProtocolParams.setContentCharset(param, "UTF-8");

    httpclient = new DefaultHttpClient(param);

    ResponseHandler <String> res=new BasicResponseHandler(); 
    List<NameValuePair> nameValuePairs;

    nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("id","1"));
    nameValuePairs.add(new BasicNameValuePair("api", "1"));


    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
Log.v("1",System.currentTimeMillis()+"");// Log to know the time diff
    String result= httpclient.execute(httppost, res);
Log.v("2",System.currentTimeMillis()+""); //  Log to know the time diff

このコードは、約 2.5 秒 (3G または WiFi の場合) を浪費して投稿を送信し、サーバーから "ok" の文字列を取得します。wifi が良好な場合でも、今回は 2.2 / 2.0 秒までしか低下しません。

同じ電話と 3G を介してインターネットに接続されたコンピューターで単純な Ajax sendpost スクリプトを実行しました。同じことを行うのに約 0.300 ミリ秒かかります。

/// ***更新

コンピューターでjqueryスクリプトを再試行しました(モバイル3G + / HDSPA接続を使用)

平均応答時間は約250msですが、常に最初のリクエストは最大 1.7秒です。30 秒間隔で投稿を送信しようとしたところ、平均時間が 1.5 秒になりました。次に、2 秒間隔で投稿を送信しようとしました。 1.41 秒、次は 252 ミリ秒でした

ここでチャートを見ることができます: http://i46.tinypic.com/27zjl8n.jpg

ケーブル接続 (標準のホーム DSL) を使用したこの同じテストでは、常に~170ms間隔の固定時間応答が提供されます (ここでは確固たる議論ではありませんが、最初の試行はわずかに高い可能性があります)。

つまり、最初の試行でモバイル接続に深刻な影響を与える何か (または間違っている) があります。何かアイデアはありますか?

4

1 に答える 1

7

Try using this configuration

HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

This is the javadoc about setTcpNoDelay:

public static void setTcpNoDelay (HttpParams params, boolean value)

Since: API Level 1

Determines whether Nagle's algorithm is to be used. The Nagle's algorithm tries to conserve bandwidth by minimizing the number of segments that are sent. When applications wish to decrease network latency and increase performance, they can disable Nagle's algorithm (that is enable TCP_NODELAY). Data will be sent earlier, at the cost of an increase in bandwidth consumption.

Parameters

value true if the Nagle's algorithm is to NOT be used (that is enable TCP_NODELAY), false otherwise.

于 2012-11-29T09:27:11.793 に答える