2010-06-15 34 views
40
Güncelleme: Bulunan kendim

Hi :-) aşağıya bakınız cevap, HTTP Post istekleri 2 saniye sürüyor, neden?

bi'şey şu anda HTTP Post ve AsyncTask kullanarak arka planda şeyler gönderen bir android uygulaması kodlama. Bunun için org.apache.http.client paketini kullanıyorum. Kodumu this example'a göre temel aldım.

Temelde, benim kod şöyle görünür:

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()); 
    } 
} 

sorun httpclient.execute (..) çizgi 3 saniye yaklaşık 1.5 almasıdır ve neden anlamıyorum. Sadece HTTP Get ile bir sayfa istemek yaklaşık 80 ms alır, bu yüzden sorun ağ gecikme kendisi gibi görünmüyor.

Sorun, sunucu tarafında da görünmüyor, aynı şekilde yavaş sonuçlarla http://www.disney.com/'a POST verilerini denedim. Firebug, verileri sunucuya yerel olarak gönderirken 1 ms yanıt süresini gösterir.

Bu, Emulator'de ve Nexus One'ımda (her ikisi de Android 2.2 ile) gerçekleşir.

Kodun tamamını incelemek isterseniz, GitHub numaralı telefona koydum.

Sadece bir tuşa basarak AsyncTask kullanarak arka planda HTTP Post yapmak için bir kukla program. Bu benim ilk Android uygulaması ve uzun bir süre için ilk java kodum. Ve incitentially, ayrıca benim ilk soru benim Stackoverflow ;-)

httpclient.execute (httppost) neden bu kadar uzun sürüyor?

+0

Ben de aynı sorunu yaşıyorum, çok daha kötü. Bir "HttpPost" işlemini bitirmek için 20 saniyeyi bile alabilir.Fikrini denedim ama yardım etmedi. – theblang

cevap

55

Tamam, bunu daha fazla araştırmayla çözdüm.

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

I-kitap kurdu ve ve bazı deneme-yanılma dan HttpHelper Class çok güzel bu sayesinde bulundu: şöyle yapmam gereken tüm, 1.1 HTTP Versiyon ayarlayan bir parametre eklemek için oldu.

Doğru hatırlıyorsam, HTTP 1.0 her istek için yeni bir TCP bağlantısı açar. Bu büyük gecikmeyi açıklıyor mu?

Artık bir HTTP POST isteği WLAN üzerinden 50 ila 150 ms arasında ve 3G üzerinden 300 ila 500 ms arasında bir şey alır.

+2

minik bit daha basit (ancak eşdeğeri): HttpProtocolParams.setVersion (params, HttpVersion.HTTP_1_1); –

+12

Sürümün geçici çözümü yerine - neden bu işe yaradı? - Daha basit bir çözüm önerdim, 'httppost.getParams(). SetBooleanParameter (CoreProtocolPNames.USE_EXPECT_CONTINUE, false); –

+1

dude - Bu konu hakkında rasgele bir şekilde, benim uygulama için testler arasında arama yapıyordum çünkü çok yavaştı - bu değişiklik çığlık attı. TEŞEKKÜR EDERİM. – bsautner

6

Ben android değilim, ama tamamen baş tırmalamak biraz sonra, httpclient 4.0.1 ile windows platformunda tam olarak aynı tür bir sorun ile karşı karşıya, ben çözüm bulundu.

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

Parametrelerin HTTP1.1 sürümüyle ayarlanmasının neden sorunu çözmediği konusunda hiçbir fikrim yok. ama öyle. Ayrıca garip, bir HTTP Get isteği yürütme belirtisi göstermedi. Her neyse, umarım bu biraz yardımcı olurdur!

h