2010-06-15 10 views
40
अद्यतन: मिले जवाब अपने आप को, :-)

हाय नीचे देखें,एचटीपी क्लाइंट का उपयोग कर HTTP पोस्ट अनुरोध 2 सेकंड लेते हैं, क्यों?

I'am वर्तमान कि पृष्ठभूमि HTTP पोस्ट और AsyncTask का उपयोग करने में सामान प्रस्तुत एक Android एप्लिकेशन कोडिंग। मैं इसके लिए 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 के साथ एक पृष्ठ का अनुरोध करने के लिए लगभग 80 एमएस लगता है, इसलिए समस्या नेटवर्क विलंबता प्रतीत नहीं होती है।

समस्या सर्वर की ओर से प्रतीत नहीं होती है, मैंने डेटा को http://www.disney.com/ पर धीमे परिणामों के साथ पोस्ट करने का भी प्रयास किया है। और फ़ायरबग स्थानीय रूप से मेरे सर्वर पर डेटा पोस्ट करते समय 1 एमएस प्रतिक्रिया समय दिखाता है।

यह एम्यूलेटर पर और मेरे नेक्सस वन (एंड्रॉइड 2.2 के साथ दोनों) पर होता है।

यदि आप पूरा कोड देखना चाहते हैं, तो मैंने इसे GitHub पर रखा है।

यह बटन के धक्का पर AsyncTask का उपयोग करके पृष्ठभूमि में HTTP पोस्ट करने के लिए सिर्फ एक डमी प्रोग्राम है। यह मेरा पहला एंड्रॉइड ऐप है, और मेरा पहला जावा कोड लंबे समय तक है। और गोपनीय रूप से, स्टैक ओवरफ्लो पर मेरा पहला प्रश्न ;-)

कोई विचार क्यों httpclient.execute (httppost) इतना लंबा लगता है?

+0

मुझे यह वही समस्या का सामना करना पड़ रहा है, सिवाय इसके कि बहुत बुरा। यह 'HttpPost' को समाप्त करने के लिए 20 सेकंड तक भी ले सकता है।मैंने आपके फिक्स की कोशिश की लेकिन यह मदद नहीं कर सका। – theblang

उत्तर

55

ठीक है, मैंने इसे और अधिक जांच के साथ हल किया।

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

मैं और-Bookworm और कुछ परीक्षण और त्रुटि से बहुत अच्छा है HttpHelper Class को यह धन्यवाद पाया: सभी मैं करना था एक पैरामीटर 1.1 करने के लिए HTTP संस्करण सेट है कि जोड़ने के लिए इस प्रकार था,।

यदि मुझे सही याद है, तो HTTP 1.0 प्रत्येक अनुरोध के लिए एक नया टीसीपी कनेक्शन खोलता है। क्या यह बड़ी देरी की व्याख्या करता है?

एक HTTP पोस्ट अनुरोध अब डब्ल्यूएलएएन पर 50 से 150 एमएस और 3 जी से 300 और 500 एमएस के बीच कुछ लेता है।

+2

छोटे बिट सरल (लेकिन समतुल्य): HttpProtocolParams.setVersion (पैरा, HttpVersion.HTTP_1_1); –

+12

संस्करण वर्कअराउंड के बजाय - यह वैसे भी क्यों काम करता है? - मैं अधिक सरल समाधान का सुझाव देता हूं, 'httppost.getParams()। SetBooleanParameter (CoreProtocolPNames.USE_EXPECT_CONTINUE, false); ' –

+1

दोस्त - मैं इस विषय पर अपने ऐप के परीक्षणों के बीच यादृच्छिक रूप से खोज रहा था क्योंकि यह बहुत धीमा था - यह परिवर्तन इसे चिल्लाया। धन्यवाद। – bsautner

6

मैं एंड्रॉइड पर नहीं हूं, लेकिन मुझे बहुत कुछ सिर स्क्रैचिंग के बाद, विंडोज क्लाइंट 4.0.1 के साथ विंडोज प्लेटफ़ॉर्म पर बिल्कुल उसी तरह की समस्या का सामना करना पड़ा, मुझे समाधान मिला।

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 HTTP निष्पादन अनुरोध अगर लक्षण नहीं दिखाया गया था।

किसी भी तरह, मुझे आशा है कि इससे कुछ बाहर निकलने में मदद मिलेगी!

एच

संबंधित मुद्दे