2010-06-15 61 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

相關問題