Android 第一次HTTP POST和GET尝试总是很慢-这是与操作系统相关还是与网络相关?
我现在刚开始在HTTP中湿脚。我一直在使用GET和POST对简单的HTTP请求进行计时。我使用的网页是一个三行php检查,检查是否有正确的$\u GET[]和$\u POST[],然后简单地回显字符“1”。 我使用相同的单短名称/值对使用POST和GET,希望不需要数据包碎片来搞乱事情,所有这些都是在脱离UI线程的线程上完成的。请求在手机上循环数次,同时计时。一切都很好。(参见下面的代码)也就是说,我得到了“1”的响应。但存在一个持续的时间问题。 我观察到的是:Android 第一次HTTP POST和GET尝试总是很慢-这是与操作系统相关还是与网络相关?,android,http,networking,http-post,http-get,Android,Http,Networking,Http Post,Http Get,我现在刚开始在HTTP中湿脚。我一直在使用GET和POST对简单的HTTP请求进行计时。我使用的网页是一个三行php检查,检查是否有正确的$\u GET[]和$\u POST[],然后简单地回显字符“1”。 我使用相同的单短名称/值对使用POST和GET,希望不需要数据包碎片来搞乱事情,所有这些都是在脱离UI线程的线程上完成的。请求在手机上循环数次,同时计时。一切都很好。(参见下面的代码)也就是说,我得到了“1”的响应。但存在一个持续的时间问题。 我观察到的是: 在第一次尝试中,发出请求的时间比
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
以及:
使用runnables:
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);
}
};
以及
输出通常为:
(0)GET往返时间为368毫秒
(1) 往返时间为103毫秒
(2) 往返时间为98毫秒
(3) 往返时间为106毫秒
(4) 往返时间为102毫秒
(0)往返行程后为1289 ms (1) 往返行程后567毫秒 (2) 往返行程后为589毫秒 (3) 往返行程后为496毫秒
(4) 往返后的时间为557毫秒。我坚持要求您将
协议版本设置为HTTP1.1
,并尝试一下。这将比现在所需的时间增加请求/响应时间。我没有试过,只是得到了信息。因此,在执行请求之前,您可以尝试以下方法
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);
我同意Lalit Poptani的回答,这可能有助于更快地拨打电话,因为HTTP 1.1保持连接,不会每次都握手
但同时,我想说的是,这不是Android特有的问题,几乎每个平台和每种语言都会发生同样的情况,因为当您第一次进行任何http调用时,平台需要创建和设置不同的对象,为其分配值以执行调用,而这一点一直存在,因此,当您进行新调用时,可以节省创建和分配对象的时间,从而获得更快的响应
这些物体是什么上面几行已经说过了:我没有任何非常清晰的列表,但它们就像代理设置一样,为它缓存内存
再等几分钟,直到有人对此有了深入的技术知识,并解释了后面的所有内容是如何工作的。在第一次请求后,结果可能会得到cachedmaybe dns解析?试试ipaddress@rambo只是用同样的结果尝试了一个显式IP地址。它只是尝试了一下,该死,没有改变。为了完整起见,我还更新了我发布的代码以包含它。谢谢你的建议,谢谢。我没有在我使用过的任何其他操作系统中进行过这种类型的编程。
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);
}
};
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);