2011-04-24 13 views
6

Estoy intentando descargar un mp3 externo en el almacenamiento interno. Sin embargo, los archivos que intento descargar son grandes, por lo que intento descargarlos en fragmentos de 1MB para que pueda comenzar a reproducirlos mientras se descarga el resto. Aquí está mi código de secuencia:InputStream no se cerrará, o tomará para siempre

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

descarga el archivo bien, pero cuando se llega a is.close() en la sentencia finally, se cuelga. Si espero un realmente largo tiempo, eventualmente se cerrará. Parece que todavía está descargando el resto del archivo. ¿Cómo evito esto y cierro la transmisión de inmediato?

Respuesta

7

Con HTTP, normalmente todavía tiene que leer (y descartar) todo el resto de la secuencia de respuesta; no puede simplemente cerrar. Toda la secuencia debe ser consumida. No estoy seguro de si el httpclient de Android se basa en los recursos comunes httpclient 3 o 4: con 4 puede usar HttpUriRequest # abort() para finalizar antes. No estoy seguro si 3 tiene tal opción

Editar: busqué y parece que httpclient 3, y se puede hacer httpget.abort()

+0

perfecto. ¡Gracias! –

+0

Funcionó para mí también. Curiosamente, la mayoría de las implementaciones de Android no se cuelgan. Solo he visto esto en el Droid X2 hasta ahora. – dhaag23

+0

en mi método de aborto DefaultHttpClient falta, pero mHttpClient.getConnectionManager(). Shutdown() funciona muy bien. – pvllnspk

Cuestiones relacionadas