2011-04-24 14 views
6

पर ले जाएगा मैं बाहरी स्टोरेज में बाहरी एमपी 3 डाउनलोड करने का प्रयास कर रहा हूं। हालांकि, जिन फ़ाइलों को मैं डाउनलोड करने का प्रयास कर रहा हूं वे बड़े हैं, इसलिए मैं उन्हें 1 एमबी भाग में डाउनलोड करने की कोशिश कर रहा हूं ताकि बाकी डाउनलोड होने पर आप उन्हें खेलना शुरू कर सकें। यहाँ मेरी धारा कोड है:इनपुटस्ट्रीम बंद नहीं होगा, या हमेशा

InputStream is = null; 
    OutputStream os = null; 

    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(url); 
     HttpResponse response = client.execute(get); 

     MyLog.d("Connection established"); 

     byte[] buffer = new byte[8192]; 
     is = new BufferedInputStream(response.getEntity().getContent(), buffer.length); 
     os = openFileOutput(filename, MODE_PRIVATE); 

     int size; 
     int totalSize = 0; 

     while ((size = is.read(buffer)) != -1 && totalSize < 1048576) { 
      os.write(buffer, 0, size); 
      totalSize += size; 
     } 

     MyLog.d("Finished downloading mix - " + totalSize + " bytes"); 
    } 
    catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     if (os != null) { 
      try { 
       os.flush(); 
       os.close(); 
      } 
      catch (IOException e) { 
       MyLog.e("Failed to close output stream."); 
      } 
     } 
     if (is != null) { 
      try { 
       is.close(); 
      } 
      catch (IOException e) { 
       MyLog.e("Failed to close input stream."); 
      } 
     } 
    } 

यह फ़ाइल ठीक डाउनलोड करता है, लेकिन जब यह() अंत में बयान में is.close लिए हो जाता है, यह लटका हुआ है। अगर मैं वास्तव में लंबे समय तक प्रतीक्षा करता हूं तो यह अंततः बंद हो जाएगा। ऐसा लगता है कि यह अभी भी बाकी फाइल डाउनलोड कर रहा है। मैं इससे कैसे बचूं और तुरंत स्ट्रीम बंद करूँ?

उत्तर

7

HTTP के साथ, आपको आमतौर पर अभी भी प्रतिक्रिया प्रतिक्रिया के बाकी हिस्सों को पढ़ना है (और फेंकना) - आप बस बंद नहीं कर सकते हैं। पूरी धारा का उपभोग किया जाना चाहिए। मुझे यकीन नहीं है कि एंड्रॉइड का httpclient कॉमन्स httpclient 3 या 4 पर आधारित है - 4 के साथ आप HttpUriRequest # abort() को जल्दी समाप्त करने के लिए उपयोग कर सकते हैं। नहीं यकीन है कि अगर 3 तरह के एक विकल्प होता है

संपादित करें: यह देखा और यह httpclient 3 की तरह लग रहा है, और आप httpget.abort कर सकते हैं()

+0

बिल्कुल सही। धन्यवाद! –

+0

मेरे लिए भी काम किया। विचित्र रूप से, ज्यादातर एंड्रॉइड कार्यान्वयन लटका नहीं है। मैंने इसे अभी तक Droid X2 पर देखा है। – dhaag23

+0

में मेरे DefaultHttpClient abort विधि में अनुपलब्ध है, लेकिन mHttpClient.getConnectionManager()। Shutdown() बहुत अच्छा काम करता है। – pvllnspk

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