2010-06-15 64 views
40
更新: 找到自己的答案,请参见下面:-)

嗨,使用HttpClient的HTTP Post请求需要2秒,为什么?

我'当前译码的Android应用程序,在使用HTTP POST和的AsyncTask后台提交的东西。我为此使用org.apache.http.client包。我根据我的代码this example

基本上,我的代码看起来是这样的:

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毫秒左右,所以这个问题似乎并不是网络延迟本身。

该问题似乎并未出现在服务器端,我也尝试将数据发布到http://www.disney.com/,结果相似。在本地向我的服务器发送数据时,Firebug显示1毫秒的响应时间。

这发生在模拟器和我的Nexus One(都与Android 2.2)。

如果你想看完整的代码,我已经把它放在GitHub

这只是一个虚拟程序,通过按下按钮在后台使用AsyncTask执行HTTP Post。这是我的第一个Android应用程序,也是我第一个很长时间的Java代码。并incidentially,也是我在Stackoverflow上的第一个问题;-)

httpclient.execute(httppost)需要这么长时间的任何想法?

+0

我遇到了这个完全相同的问题,除了更糟。它甚至可能需要20秒钟才能完成一个'HttpPost'。我尝试了你的修复,但它似乎没有帮助。 – theblang 2014-03-13 22:00:56

回答

55

好吧,我自己解决了这个问题,还有一些调查。我所要做的就是添加一个设置HTTP版本1.1的参数,如下所示:

HttpParams params = new BasicHttpParams(); 
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
HttpClient httpclient = new DefaultHttpClient(params); 

我从和书呆子和一些试验和错误发现这多亏了非常好的HttpHelper Class

如果我没有记错,HTTP 1.0会为每个请求打开一个新的TCP连接。这是否解释了大的延迟?

HTTP POST请求现在需要在WLAN上50到150 ms之间,而在3G上需要300到500 ms之间的时间。

+2

稍微简单一些(但相当于):HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1); – 2011-04-05 14:15:43

+12

而不是版本解决方法 - 为什么这个工作呢? - 我建议更直接的解决方案,'httppost.getParams()。setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,false);' – 2011-06-09 12:29:04

+1

伙计 - 我在随机搜索这个主题之间的测试为我的应用程序,因为它是如此之慢 - 这种变化使它尖叫。谢谢。 – bsautner 2013-01-14 21:17:40

6

我不是在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

相关问题