私は今、HTTP で足を濡らし始めたところです。GET と POST を使用して単純な HTTP リクエストのタイミングを計っています。私が使用した Web ページは、正しい $_GET[] と $_POST[] の 3 行の php チェックで、文字 "1" を単にエコーします。私は POST と GET を同じ単一の短い名前と値のペアで使用します。これは、パケットの断片化が問題を解決する必要がないことを望んでおり、これはすべて UI スレッドから離れたスレッドで行われます。リクエストは、タイミングを計っている間、電話で数回ループされます。すべてうまくいきます。(以下のコード参照) つまり、「1」という応答が返ってきます。しかし、永続的なタイミングの問題があります。私が観察しているのは、次のことです。
最初の試行では、GET メソッドと POST メソッドの両方で、その後の試行よりも要求を作成する時間がはるかに長くなります。
残りの試行は、どちらの場合も常にはるかに高速です。
GET は常に POST より高速です。
これらはすべて 3G および Wi-Fi 接続に当てはまります (ただし、Wi-Fi を使用すると、予想どおり全体的にはるかに高速になります)。
私はこれを BasicResponseHandler() で試しましたが、より手動の Buffered IO Stream メソッドで同じ結果が得られました。
3. は、POST が 2 つの送信を必要とする結果であることを理解していると思います。- これは正しいです?
私の主な質問は、非常に遅い最初のリクエスト試行で何が起こっているのですか? 場合によっては数秒かかることもあります(!)。物事を停滞させているのはネットワークですか、それとも Android が何らかのキューを作成するソケットにそれを入れていますか? Android の場合、より適切にコーディングしてこれを回避する方法はありますか? 実行中に一度だけこれを問題にするためにソケットを開いたままにしておくことについて何かありますか? もしそうなら、そうするのは良い習慣ですか?確かに、この側面は私が最も無知です。
これに関するいくつかの議論を見つけましたが、この側面に直接影響を与えるものはありません。
--
GET メソッドと POST メソッドの両方の基本的なコードは次のようになり (try/catch を除く)、UI から離れたスレッドで実行されます。最初に GET メソッド、次に POST メソッドです: (以下の出力)
その一部を取得します。
public String[] HTTPGETIt(int numrounds)
{
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter (CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpGet GETRequest = new HttpGet("http://mypage.com/epoch.php?mynameis=tam");
ResponseHandler <String> MyBRH = new BasicResponseHandler();
String[] GETResult = new String[numrounds];
int i = 0;
long timestart, DT;
while(i < numrounds)
{
timestart = System.currentTimeMillis();
GETResult[i] = httpclient.execute(GETRequest, MyBRH);
DT = System.currentTimeMillis() - timestart;
Log.d(TAG, "(" + i + ") GET-Round Trip was "+ DT + " ms.");
i++;
}//while i <= numrounds
httpclient.getConnectionManager().shutdown();
return GETResult;
} //END HTTPGETIt
そしてPOSTバージョン:
public String[] HTTPPOSTIt(int numrounds)
{
String Place = "HTTPPostping";
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpPost PostRequest = new HttpPost("http://mypage.com/epoch.php");
ResponseHandler <String> MyBRH = new BasicResponseHandler();
String[] POSTResult = new String[numrounds];
List<NameValuePair> MynameValuePairs = new ArrayList<NameValuePair>(2);
MynameValuePairs.add(new BasicNameValuePair("mynameis", "tam"));
PostRequest.setEntity(new UrlEncodedFormEntity(MynameValuePairs));
int i = 0;
long timestart, DT;
while(i < numrounds)
{
timestart = System.currentTimeMillis();
POSTResult[i] = httpclient.execute(PostRequest, MyBRH);
DT = System.currentTimeMillis() - timestart;
Log.d(TAG, "(" + i + ") POST-Round Trip was "+ DT + " ms.");
i++;
}//while i <= numrounds
httpclient.getConnectionManager().shutdown();
return POSTResult;
} // END HTTPPOSTIt
これらは次のように呼び出されます。
Runnable HTTPGETJob = new HTTPGETTask(NS);
Thread HTTPGETThread = new Thread(HTTPGETJob, "HTTPGETThread");
HTTPGETThread.setPriority(Thread.MAX_PRIORITY);
HTTPGETThread.start();
と:
Runnable HTTPPOSTJob = new HTTPPOSTTask(NS);
Thread HTTPPOSTThread = new Thread(HTTPPOSTJob, "HTTPPOSTThread");
HTTPPOSTThread.setPriority(Thread.MAX_PRIORITY);
HTTPPOSTThread.start();
ランナブルを使用:
class HTTPGETTask implements Runnable
{
int numtimes;
DeviceInfo tsrtDI;
HTTPGETTask(int inNS) {
this.numtimes = inNS;
}
@Override
public void run()
{
long [] TT2NS = new long[numtimes];
TT2NS = HTTPGETIt(numtimes);
}
};
と、
class HTTPPOSTTask implements Runnable
{
int numtimes;
DeviceInfo tsrtDI;
HTTPPOSTTask(int inNS) {
this.numtimes = inNS;
}
@Override
public void run()
{
long [] TT2NS = new long[numtimes];
TT2NS = HTTPPOSTIt(numtimes);
}
};
通常、出力は次のようになります。
(0) GET 往復は 368 ミリ秒でした。
(1) GET 往復は 103 ミリ秒でした。
(2) GET 往復は 98 ミリ秒でした。
(3) GET 往復は 106 ミリ秒でした。
(4) GET-Round Trip は 102 ミリ秒でした。
(0) POST 往復は 1289 ミリ秒でした。
(1) POST 往復は 567 ミリ秒でした。
(2) POST 往復は 589 ミリ秒でした。
(3) POST-Round Trip は 496 ミリ秒でした。
(4) POST-Round Trip は 557 ミリ秒でした。