2012-06-13 6 views
6

अब मैंने अपने पैरों को HTTP में गीला करना शुरू कर दिया है। मैं जीईटी और पोस्ट का उपयोग कर सरल HTTP आवश्यकताएं कर रहा हूं। मैंने जिस वेब पेज का उपयोग किया है वह सही $ _GET [] और $ _POST [] के लिए एक 3 लाइन PHP जांच है, फिर अक्षर "1" को प्रतिबिंबित करें। मैं पोस्ट का उपयोग करता हूं और उसी के साथ प्राप्त करता हूं, एक छोटा सा नाम/मूल्य जोड़ी उम्मीद करता है कि चीजों को मक्का करने के लिए पैकेट विखंडन की आवश्यकता नहीं होगी, और यह सब यूआई थ्रेड से बंद धागे पर किया जाता है। अनुरोध करते समय अनुरोध कई बार फ़ोन पर लूप किया जाता है। सभी अच्छी तरह से काम करता है। (नीचे कोड देखें) यही है, मैं "1" की प्रतिक्रिया वापस प्राप्त करता हूं। लेकिन एक सतत समय मुद्दा है।पहला HTTP पोस्ट और जीईटी प्रयास हमेशा धीमे होते हैं - क्या यह ओएस संबंधित या नेटवर्क है?

  1. पहले ही प्रयास में समय अनुरोध करने के लिए है बहुत लंबे समय तक दोनों प्राप्त और पोस्ट तरीकों में बाद में trys से: क्या मैं देख सकते हैं कि है।

  2. बाकी प्रयास दोनों के लिए हमेशा तेज़ होते हैं।

  3. जीईटी पोस्ट से हमेशा तेज है।

इन सभी 3 जी और वाईफाई कनेक्शन के लिए सच है (लेकिन वाईफ़ाई के साथ बहुत तेजी से समग्र रूप में की उम्मीद) कर रहे हैं।

मैंने इसे BasicResponseHandler() के साथ और एक ही परिणाम के साथ अधिक मैन्युअल Buffered IO स्ट्रीम विधियों के साथ प्रयास किया है।

मुझे विश्वास है कि मैं समझता हूं 3. परिणामस्वरूप एक पोस्ट के लिए दो प्रसारण की आवश्यकता होती है, एक 'HTTP 100' वापसी के लिए एक पैकेट बॉडी। - क्या ये सही है?

मेरा प्राथमिक प्रश्न यह है कि पहले अनुरोध प्रयासों में क्या हो रहा है जो इतनी धीमी है? कभी-कभी इसमें कई सेकंड लगते हैं (!)। क्या यह नेटवर्क है जो चीजों को पकड़ रहा है या एंड्रॉइड इसे किसी सॉकेट बनाने वाली कतार में डाल रहा है? यदि यह एंड्रॉइड है, तो क्या अधिक उचित तरीके से कोड करने और इससे बचने का कोई तरीका है? निष्पादन के दौरान केवल एक बार यह मुद्दा बनाने के लिए सॉकेट खोलने के बारे में कुछ है? यदि हां, तो ऐसा करने के लिए यह अच्छा अभ्यास है? माना जाता है कि, इस एपसेक्ट के बारे में मैं सबसे ज्यादा अनजान हूं।

मुझे इस पर कुछ चर्चा मिली है, लेकिन कोई भी इस पहलू को सीधे मार नहीं रहा है।

-

के लिए बुनियादी कोड दोनों प्राप्त और पोस्ट तरीकों (ऋण ट्राई/कैच) इस तरह दिखता है, और यूआई बंद एक सूत्र में प्रदर्शन कर रहे हैं, पहले 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 

और बाद संस्करण:

public String[] HTTPPOSTIt(int numrounds) 
{ 
String Place = "HTTPPostping"; 
HttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1); 
HttpPost PostRequest = new HttpPost("http://mypage.com/epoch.php"); 
ResponseHandler <String> MyBRH = new BasicResponseHandler(); 
String[] POSTResult = new String[numrounds]; 

List<NameValuePair> MynameValuePairs = new ArrayList<NameValuePair>(2); 
MynameValuePairs.add(new BasicNameValuePair("mynameis", "tam")); 

PostRequest.setEntity(new UrlEncodedFormEntity(MynameValuePairs)); 

int i = 0; 
long timestart, DT; 
while(i < numrounds) 
{ 
    timestart = System.currentTimeMillis(); 
    POSTResult[i] = httpclient.execute(PostRequest, MyBRH); 
    DT = System.currentTimeMillis() - timestart; 
    Log.d(TAG, "(" + i + ") POST-Round Trip was "+ DT + " ms."); 
    i++; 
}//while i <= numrounds 
httpclient.getConnectionManager().shutdown(); 
return POSTResult; 
} // END HTTPPOSTIt 

Runnable HTTPGETJob = new HTTPGETTask(NS); 
Thread HTTPGETThread = new Thread(HTTPGETJob, "HTTPGETThread"); 
HTTPGETThread.setPriority(Thread.MAX_PRIORITY); 
HTTPGETThread.start(); 

और:

ये द्वारा कहा जाता है

Runnable HTTPPOSTJob = new HTTPPOSTTask(NS); 
Thread HTTPPOSTThread = new Thread(HTTPPOSTJob, "HTTPPOSTThread"); 
HTTPPOSTThread.setPriority(Thread.MAX_PRIORITY); 
HTTPPOSTThread.start(); 

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

और,

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

उत्पादन आम तौर पर है:

(0) जीईटी-राउंड ट्रिप 368 एमएस था।

(1) जीईटी-राउंड ट्रिप 103 एमएस था।

(2) जीईटी-राउंड ट्रिप 98 एमएस था।

(3) जीईटी-राउंड ट्रिप 106 एमएस था।

(4) जीईटी-राउंड ट्रिप 102 एमएस था।


(0) बाद राउंड ट्रिप 1289 एमएस था।

(1) पोस्ट-राउंड ट्रिप 567 एमएस था।

(2) पोस्ट-राउंड ट्रिप 58 9 एमएस था।

(3) पोस्ट-राउंड ट्रिप 496 एमएस था।

(4) पोस्ट-राउंड ट्रिप 557 एमएस था।

+0

पहले अनुरोध परिणामों के बाद कैश हो रहा है –

+0

शायद डीएनएस संकल्प हो सकता है? एक आईपी पता – goat

+0

@rambo आज़माएं बस एक ही परिणाम के साथ एक स्पष्ट आईपी पते की कोशिश की। – Tam

उत्तर

1

मैं आपको Protocol VersionHTTP 1.1 के रूप में सेट करने और इसे आज़माने के लिए आग्रह करता हूं। यह अब जो कुछ भी लेता है उससे अनुरोध/प्रतिक्रिया समय बढ़ाएगा। हालांकि मैंने कोशिश नहीं की है, बस जानकारी मिली है। तो, आप अनुरोध निष्पादित करने से पहले नीचे की तरह कुछ कोशिश कर सकते हैं।

httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                 HttpVersion.HTTP_1_1); 
+0

यह अभी कोशिश की, डर्न, कोई बदलाव नहीं। मैंने बस उस कोड को अपडेट किया जिसे मैंने पोस्ट करने के लिए पोस्ट किया है, केवल पूर्णता के लिए। फिर भी सुझाव के लिए धन्यवाद। – Tam

1

मैं के साथ ललित Poptani के जवाब इस बात से सहमत है, तेजी से कॉल करने के लिए मदद मिल सकती है के रूप में यह क्योंकि HTTP 1.1 कनेक्शन रहता है और हर बार हाथ से हिला कर न हो रहा है।

लेकिन साथ ही, मैं यह कहना चाहूंगा कि यह एक एंड्रॉइड विशिष्ट समस्या नहीं है, यह वही बात लगभग प्रत्येक प्लेटफ़ॉर्म और प्रत्येक भाषा में होती है क्योंकि पहली बार जब आप कोई http कॉल करते हैं तो मंच को बनाने की आवश्यकता होती है और इसके लिए अलग-अलग ऑब्जेक्ट्स सेट करें जो इसे कॉल करने के लिए मान निर्दिष्ट करते हैं, और जो वहां रहता है, इसलिए जब आप नई कॉल करते हैं तो वस्तुओं को बनाने और असाइन करने का समय बचाया जाता है, इसलिए आपको तेज प्रतिक्रिया मिलती है।

ये ऑब्जेक्ट कौन से हैं? - उपर्युक्त पंक्तियों में कहा गया है: मेरे पास उनमें से कोई स्पष्ट स्पष्ट सूची नहीं है लेकिन वे प्रॉक्सी सेटिंग्स की तरह हैं, इसके लिए कैश मेमोरी।


कुछ और इंतजार करें, जब तक कोई इस पर गहरे तकनीकी ज्ञान के साथ आता है और बताता है कि सभी चीजें पीछे कैसे काम करती हैं।

+0

धन्यवाद। मैंने इस प्रकार के प्रोग्रामिंग को किसी भी अन्य ओएस के साथ नहीं किया है जिसके साथ मैंने काम किया है। – Tam

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