2012-06-15 10 views
22

El siguiente código funciona básicamente como se esperaba. Sin embargo, para ser paranoico, me preguntaba, para evitar la fuga de recursos,Necesito llamar a HttpURLConnection.disconnect después de terminar de usarlo

  1. ¿Es necesario llamar HttpURLConnection.disconnect, después de terminar su uso?
  2. ¿Debo llamar al InputStream.close?
  3. ¿Debo llamar al InputStreamReader.close?
  4. ¿Necesito tener las 2 siguientes líneas de código: httpUrlConnection.setDoInput(true) y httpUrlConnection.setDoOutput(false), justo después de la construcción de httpUrlConnection?

La razón por la que pregunto es por la mayoría de los ejemplos que vi que no hacen tal limpieza. http://www.exampledepot.com/egs/java.net/post.html y http://www.vogella.com/articles/AndroidNetworking/article.html. Solo quiero asegurarme de que esos ejemplos sean correctos también.


public static String getResponseBodyAsString(String request) { 
    BufferedReader bufferedReader = null; 
    try { 
     URL url = new URL(request); 
     HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection(); 
     InputStream inputStream = httpUrlConnection.getInputStream(); 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

     int charRead = 0; 
     char[] buffer = new char[1024]; 
     StringBuffer stringBuffer = new StringBuffer(); 
     while ((charRead = bufferedReader.read(buffer)) > 0) { 
      stringBuffer.append(buffer, 0, charRead); 
     } 
     return stringBuffer.toString(); 
    } catch (MalformedURLException e) { 
     Log.e(TAG, "", e); 
    } catch (IOException e) { 
     Log.e(TAG, "", e); 
    } finally { 
     close(bufferedReader); 
    } 
    return null; 
} 

private static void close(Reader reader) { 
    if (reader != null) { 
     try { 
      reader.close(); 
     } catch (IOException exp) { 
      Log.e(TAG, "", exp); 
     } 
    } 
} 

Respuesta

22

Sí se necesita para cerrar el flujo de entrada primero y cerca HttpConnection siguiente. Según javadoc.

Cada instancia de HttpURLConnection se utiliza para realizar una única solicitud, pero la conexión de red subyacente al servidor HTTP puede ser compartida de manera transparente por otras instancias. Llamar a los métodos close() en el InputStream o OutputStream de un HttpURLConnection después de una solicitud puede liberar recursos de red asociados con esta instancia, pero no tiene ningún efecto en ninguna conexión persistente compartida. Llamar al método disconnect() puede cerrar el socket subyacente si una conexión persistente está inactiva en ese momento.

Las siguientes dos preguntas responden según el propósito de su conexión. Lea esto link para más detalles.

+0

Gracias. ¿Crees que hay errores en los dos enlaces de tutoriales anteriores dado que no llaman desconexión? ¿O me estoy perdiendo algo? –

+2

No digo que sea un error. Pero, la desconexión es un caso extremo (las operaciones de apertura de socket son costosas), a menos que realmente quieras, yo no iría por ello. stream.close() libera la mayoría de los recursos de red y debería ser suficiente. De nuevo, si su requisito está bien para crear un socket cada vez, no hay nada de malo en desconectar llamadas. – kosa

+0

Seguiré haciendo solicitudes frecuentes a casi el mismo servidor, y la fuga de memoria es mi única preocupación. Si entiendo la documentación correctamente, no es necesario llamar a desconexión en mi caso. –

0

Creo que el requisito para llamar a setDoInput() o setDoOutput() es asegurarse de que se invoquen antes de escribir o leer algo de una secuencia en la conexión. Más allá de eso, no estoy seguro de que importe cuando se llamen esos métodos.

Cuestiones relacionadas