2013-06-11 14 views
10

मैं सर्वर से एक बड़ी आकार ज़िप फ़ाइल डाउनलोड कर रहा हूं। मैंबड़े आकार की ज़िप फ़ाइल डाउनलोड करते समय सॉकेट अपवाद

06-11 21:45:18.789: I/System.out(8993): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 

मेरे एप्लिकेशन के पास निम्न बंद नहीं हो रही है, लेकिन मेरे डाउनलोडिंग बंद हो जाता है। यह एचडीपीआई एंड्रॉइड मोबाइल पर विशेष रूप से कम प्रोसेसर डिवाइस कहता है। डाउनलोडिंग एस 3 और टैबलेट पर ठीक काम करता है। मैं फ़ाइल डाउनलोड करने के लिए सरल FileOutputStream विधि का उपयोग कर रहा हूँ।

+0

कृपया पेस्ट यहाँ कोड –

उत्तर

3

आप HttpConnection उपयोग कर रहे हैं तो समय समाप्त वृद्धि

HttpURLConnection चोर = (HttpURLConnection) url.openConnection();

con.setReadTimeout (10000);

या

HttpConnectionParams.setSoTimeout (httpParameters, 10000); //

+0

Nop @hharry मैं ** BufferedInputStream इनपुट उपयोग कर रहा हूँ = नए BufferedInputStream (url.openStream(), 8192) ; ** –

+0

इस एसओ [लिंक] के अनुसार (http://stackoverflow.com/questions/2638283/can-i-set-a-timeout-for-a-inputstreams-read-function) आप सॉकेट पर टाइमआउट सेट कर सकते हैं । 'सॉकेट # setSoTimeout (int)'। –

1

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

मेरा सुझाव बैंडविड्थ दर limiter को लागू करने की कोशिश कर रहा है। इस तरह आप जांच सकते हैं कि धीमे डिवाइस उन लंबे डाउनलोडों के लिए बेहतर प्रतिक्रिया देते हैं, हालांकि वे धीमे हो जाएंगे।

3

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

दूसरी ओर, आप (यदि आप पहले से नहीं हैं) साथ ही DownloadManager आज़मा सकते हैं। this official article on wakelocks राज्यों,

के रूप में "यदि आपका ऐप प्रदर्शन कर रहा है लंबे समय से चल HTTP डाउनलोड, DownloadManager उपयोग करने पर विचार।"

1

लिंक नीचे आप

Android download large files

Android - Large file downloads stop - using async/progressdialog

लिए उपयोगी हो सकता है

फ़ाइल को अतुल्यकालिक रूप से डाउनलोड करने के लिए loopj lib का प्रयास करें http://loopj.com/android-async-http/ मुझे बड़ी फ़ाइल डाउनलोड करने के लिए loopj lib के बारे में निश्चित नहीं है लेकिन आप इसे परीक्षण और त्रुटि के माध्यम से कर सकते हैं।

0

HTTP सर्वर के साथ काम करने के लिए मैं दृढ़ता से Loopj लाइब्रेरी का सुझाव देता हूं, यह एक विश्वसनीय, सरल और उपयोग करने में आसान लाइब्रेरी है। प्रलेखन के रूप में कहा आप बस इस तरह एक फ़ाइल डाउनलोड कर सकते हैं:

AsyncHttpClient client = new AsyncHttpClient(); 
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" }; 
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) { 
    @Override 
    public void onSuccess(byte[] fileData) { 
     // Do something with the file 
    } 
}); 
संबंधित मुद्दे