2011-04-24 38 views
6

Tôi đang cố gắng tải xuống một mp3 bên ngoài vào bộ nhớ trong. Tuy nhiên, các tập tin tôi đang cố gắng tải xuống là lớn, vì vậy tôi đang cố gắng tải chúng xuống theo khối 1MB để bạn có thể bắt đầu phát chúng trong khi phần còn lại được tải xuống. Dưới đây là mã luồng của tôi:InputStream sẽ không đóng, hoặc mất mãi mãi đến

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."); 
      } 
     } 
    } 

Nó tải tệp tin tốt, nhưng khi nó đến được.close() trong tuyên bố cuối cùng, nó bị treo. Nếu tôi đợi thực sự thời gian dài nó sẽ đóng lại. Có vẻ như nó vẫn tải xuống phần còn lại của tệp. Làm cách nào để tránh điều này và đóng luồng ngay lập tức?

Trả lời

7

Với HTTP, Bạn thường vẫn phải đọc (và vứt bỏ) toàn bộ phần còn lại của luồng phản hồi - bạn không thể chỉ đóng. Toàn bộ luồng phải được tiêu thụ. Tôi không chắc liệu httpnhient của Android có dựa trên commons httpclient 3 hay 4 - với 4 bạn có thể sử dụng HttpUriRequest # abort() để kết thúc sớm. Không chắc chắn nếu 3 có tùy chọn như vậy

Chỉnh sửa: Đã tìm kiếm và có vẻ như httpclient 3 và bạn có thể thực hiện httpget.abort()

+0

Hoàn hảo. Cảm ơn! –

+0

Làm việc cho tôi. Thật kỳ lạ, phần lớn việc triển khai Android không treo. Tôi đã chỉ nhìn thấy điều này trên Droid X2 cho đến nay. – dhaag23

+0

trong phương thức Abort mặc định của tôi bị thiếu, nhưng mHttpClient.getConnectionManager(). Shutdown() hoạt động tốt. – pvllnspk

Các vấn đề liên quan