2011-08-17 14 views
5

मेरे पास एक ऐसा ऐप है जो रिमोट सेवा से थंबनेल छवियों और अन्य संसाधनों को डाउनलोड करने की एक छोटी सी छोटी राशि कर रहा है।एचटीपी क्लाइंट समय के लिए लंबे समय तक स्टाल करता है, यहां तक ​​कि टाइमआउट पैरामीटर सेट

मैं डिफ़ॉल्टHttpClient का एक उदाहरण और एक कस्टम क्लास का उपयोग कर रहा हूं जिसे मैंने लिखा है जो मेरे सभी डाउनलोड शेड्यूल करता है। सभी डाउनलोडिंग AsyncTask के माध्यम से पृष्ठभूमि धागे पर धारावाहिक में चलाया जाता है। मैं अपने डाउनलोड दिनचर्या को तब तक नहीं चलाता जब तक कि PostExecute AsyncTask में निष्पादित नहीं हो जाता है।

यह अक्सर पूरी तरह से काम करता है। अगर मैं 20 छवियों को कतारबद्ध करता हूं, तो मेरा शेड्यूलर इसकी बात ठीक करता है। हालांकि, मैं ऐसे मामलों में भाग लेता हूं जहां प्रक्रिया क्लाइंट.एक्सक्यूट को कॉल करने के बिंदु पर स्टाल करती है (जहां क्लाइंट डिफ़ॉल्ट हैटप क्लाइंट का मेरा उदाहरण है)। मैं ऐप के चारों ओर नेविगेट करके और यादृच्छिक क्रियाएं (सूची को स्क्रॉल करना, गतिविधियों के बीच आगे और पीछे नेविगेट करके) प्रक्रिया को निष्पादित कर सकता हूं। ऐसा लगता है कि मैं जो कुछ कर रहा हूं वह एक थ्रेड को "जागृत" संदेश भेज रहा है जो रुक गया है या खराब हो गया है।

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

एफडब्ल्यूआईडब्ल्यू, मैंने सॉकेट टाइमआउट और कनेक्शन एचटीपी क्लाइंट इंस्टेंस और एचटीपीजीट उदाहरण दोनों पर कनेक्शन टाइमआउट सेट किया है जो मैं निष्पादन विधि को पास करता हूं। यह निष्पादन विधि को जल्दी लौटने या अपवाद या उस तरह कुछ भी फेंकने का कारण नहीं बनता है। जब प्रक्रिया "वापस आती है", HttpClient.execute एक मान्य HttpResponse देता है और सब कुछ सामान्य के रूप में कार्य करता है।

चीजों पर कोई विचार जो मैं डीबग कर सकता हूं यह पता लगाने के लिए कि यह कहां जा रहा है? मुझे पता है कि यह एक बहुत ही विशिष्ट स्थिति है, लेकिन क्या सामान्य रूप से एंड्रॉइड में डिफ़ॉल्ट एचटीपी क्लाइंट या http यातायात को डीबग करने के लिए कोई उन्नत तरीका है?

धन्यवाद!

उत्तर

5

क्या आप थ्रेड में वही HttpClient साझा करते हैं? यह डिफ़ॉल्ट रूप से थ्रेड-सुरक्षित नहीं है, इसलिए आप इसे देखना चाहेंगे। सबसे अधिक संभावना है कि यह I/O पर अवरुद्ध हो रहा है, इसलिए आपको कुछ वायर डिबगिंग करना चाहिए। आप HttpClient तार डंप लॉग सक्षम करना कुछ इस तरह उपयोग कर सकते हैं:

Logger.getLogger("org.apache.http.wire").setLevel(Level.FINEST); 
Logger.getLogger("org.apache.http.headers").setLevel(FINEST); 
Logger.getLogger("httpclient.wire.header").setLevel(FINEST); 
Logger.getLogger("httpclient.wire.content").setLevel(FINEST); 

System.setProperty("org.apache.commons.logging.Log", 
    "org.apache.commons.logging.impl.SimpleLog"); 
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); 
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "debug"); 

इसे सक्षम करने के लिए निम्न खोल आदेश पर अमल। तार लॉग लॉगकैट के लिए आउटपुट होंगे:

adb shell setprop log.tag.org.apache.http VERBOSE 
adb shell setprop log.tag.org.apache.http.wire VERBOSE 
adb shell setprop log.tag.org.apache.http.headers VERBOSE 
+0

प्रतिक्रिया देने के लिए धन्यवाद ... इस तरह के विशिष्ट और लंबे समय से चलने वाले प्रश्नों के उत्तर प्राप्त करना कठिन है। मैं लॉगिंग करने की कोशिश करने जा रहा हूं, लेकिन मुझे विश्वास है कि आपने मुझे सही दिशा में सही दिशा में इंगित किया है। मैं AsyncTask का उपयोग कर रहा हूं जो मुझे थ्रेड पूल से थ्रेड देता है ... इससे कुछ समस्याएं हो सकती हैं। मैं एक थ्रेड व्युत्पन्न कक्षा का प्रयास करने जा रहा हूं, इसलिए अलग-अलग थ्रेड पर HttpClient.execute पर एक से अधिक एक साथ कॉल नहीं है।मैं शर्त लगा सकता हूं कि मेरे लूप को दोबारा चलाने से पहले रिटर्न निष्पादित करने के बावजूद, शायद कुछ साफ-सफाई है जो अगले थ्रेड में आने से पहले दौड़ना समाप्त नहीं हुआ है। – Rich

+0

बीटीडब्ल्यू, मैंने यह कोड जोड़ा है और मैं नहीं देखता LogCat में कोई अतिरिक्त लॉग। क्या इसके लिए कुछ और है? क्या यह एक फ़ाइल में लॉग डंप कर रहा है, या मुझे इसे लॉगकैट में देखना चाहिए? – Rich

+0

लॉगकैट पर जाना चाहिए। सुनिश्चित करें कि आप अपने ऐप के कोड से पहले इसे स्थिर करें, जैसे एक स्थिर प्रारंभकर्ता में। –

-2

मुझे पहले भी ऐसी ही समस्या है। जब मैं HTTP को कतार में करने का प्रयास करता हूं, तो विधि httpClient.execute(get); प्रतिक्रिया को वापस नहीं लौटाएगी, जैसे डेडलॉक।

HttpResponse response = httpClient.execute(get); 
HttpEntity entity = response.getEntity(); 

यह मेरा कोड है, और मैं क्या कॉल entity.consumeContent(); तो यह काम करता है।

+0

वास्तव में सवाल का जवाब नहीं दिया था। –

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