Android 第一次HTTP POST和GET尝试总是很慢-这是与操作系统相关还是与网络相关?

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”的响应。但存在一个持续的时间问题。 我观察到的是: 在第一次尝试中,发出请求的时间比

我现在刚开始在HTTP中湿脚。我一直在使用GET和POST对简单的HTTP请求进行计时。我使用的网页是一个三行php检查,检查是否有正确的$\u GET[]和$\u POST[],然后简单地回显字符“1”。 我使用相同的单短名称/值对使用POST和GET,希望不需要数据包碎片来搞乱事情,所有这些都是在脱离UI线程的线程上完成的。请求在手机上循环数次,同时计时。一切都很好。(参见下面的代码)也就是说,我得到了“1”的响应。但存在一个持续的时间问题。 我观察到的是:

  • 在第一次尝试中,发出请求的时间比GET和POST方法中的后续尝试要长得多

  • 其余的尝试对这两个方面来说总是快得多

  • GET总是比POST快

  • 所有这些都适用于3G和Wifi连接(但Wifi总体速度比预期快得多)

    我已经用BasicResponseHandler()和更多手动缓冲IO流方法尝试了这一点,并获得了相同的结果

    我相信我能理解。因此,POST需要两次传输,一次用于“HTTP 100”,然后返回数据包正文。-这是正确的吗

    我的主要问题是,在第一次请求尝试中发生了什么事情,这些请求尝试非常缓慢?有时需要几秒钟(!)。是网络在支撑着事情,还是安卓将它放入一个套接字创建队列中?如果是安卓系统,有没有一种方法可以更恰当地编码并避免这种情况?在执行过程中,是否需要保持套接字打开以使其仅成为一个问题?如果是,这样做是否良好的做法?诚然,这件事我最不了解

    我发现了一些关于这方面的讨论,但没有一个直接涉及这方面

    --

    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
    
    以及:

    使用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);