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