2011-08-22 18 views
6

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

मैं उपयोग करने की कोशिश:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

लेकिन यह केवल कनेक्शन समयबाह्य, नहीं सॉकेट टाइमआउट लिए काम किया। इसके अलावा, मैं करने की कोशिश की:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

कारण मुझे पता है कि कनेक्शन समयबाह्य काम करता है, क्योंकि मैं क्रियान्वित

httpclient.execute(httppost); 

आवेदन जब कनेक्शन अपलोड करने के दौरान खो दिया है लटका करने लगता है के बाद कनेक्शन समयबाह्य के लिए अपवाद मिलेगा , लेकिन एप्लिकेशन के बाद सर्वर से कनेक्शन सफलतापूर्वक बनाया गया है।

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

sotimeout not working in a multipart http post on android 2.1

+0

क्या आपके ऐप ने छोटे आकार की फ़ाइल के साथ काम किया है? – momo

+0

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

+0

मुझे यह वही सटीक समस्या है, सिवाय इसके कि मेरे अपलोड आकार कुछ केबी के क्रम में काफी छोटे हैं। ऐसा लगता है कि यह बग ट्रिगर करने के लिए आवश्यक है, यह जांचने के बाद नेटवर्क नीचे जाने के लिए है कि यह ऊपर है लेकिन मैं execute() को कॉल करने से पहले। – Michael

उत्तर

0

आप अपने खुद के ClientConnectionManager बनाने रहे हैं? के लिए source पर एक नज़र डालें।

वे एक नया BasicHttpParams ऑब्जेक्ट बनाते हैं और इसे ThreadSafeClientConnectionManager और DefaultHttpClient दोनों के लिए कन्स्ट्रक्टर को पास करते हैं। मुझे कन्स्ट्रक्टर को छोड़कर ClientConnectionManager पर पैरामीटर सेट करने का कोई तरीका नहीं दिख रहा है।

+1

हां मैं अपना खुद का HttpClient बनाने के लिए डिफ़ॉल्ट HttpClient को विस्तारित कर रहा हूं जो SSL सक्षम करता है। विस्तारित वर्ग createClientConnectionManager() को ओवरराइड करता है, और जैसा आपने बताया है HttpParams सेट करता है। मेरे द्वारा सूचीबद्ध कोड कनेक्शन टाइमआउट को सही ढंग से सेट करने में सक्षम था क्योंकि जब मैंने टाइमआउट समय बढ़ाया था, तब तक जब मुझे अपवाद तक उठाया गया था तब भी मुझे समय-समय पर इंतजार करना पड़ा। एकमात्र समस्या यह है कि सॉकेट टाइमआउट कभी नहीं उठाया जाता है इससे कोई फर्क नहीं पड़ता कि मैं किस मूल्य का प्रयास करता हूं। –

0

मुझे उसी समस्या के साथ आप की तरह ही समस्या का सामना करना पड़ रहा है। यह एक सैमसंग गैलेक्सी एस 2 पर एंड्रॉइड 2.3.6 चल रहा है लेकिन 4.x पर उसी डिवाइस के साथ नहीं होता है। दुर्भाग्य से यह वास्तव में डिवाइस मेरे ग्राहक का उपयोग करता है, और यह ठीक पर विभिन्न Android संस्करण और निर्माताओं के साथ लगभग 10 अन्य परीक्षण उपकरणों ...

मैं घंटे बिताए बजाय अपाचे से HttpClient की HttpUrlConnection पुस्तकालय के साथ की कोशिश कर रहा चलाता है, लेकिन अंतिम परिणाम एक ही है। AndroidHttpClient एक ही व्यवहार दिखाता है। यह मैं हूँ कि यह एक हार्डवेयर कार्यान्वयन या ओएस संबंधित समस्या की तरह लगता है का कहना है की ओर जाता है ...

केवल वैकल्पिक हल मैंने पाया धागा अगर कुछ भी बंद करने के लिए एक अलग थ्रेड में HttpClient.execute() विधि डाल दिया और thread.join(timeout) सुरक्षा के रूप में कॉल करने के लिए था बुरा हो जाता है। दोष तब होता है जब अपलोड ठीक हो जाता है लेकिन टाइमआउट से अधिक समय लगता है, अनुरोध बाधित है ...

यदि आपको इस दौरान कुछ मिला, तो मैं इसे साझा कर सकता हूं तो मैं बहुत सराहना करता हूं।