2012-06-15 10 views
22

Il seguente codice funziona fondamentalmente come previsto. Tuttavia, per essere paranoico, mi chiedevo, per evitare perdite di risorse,Devo chiamare HttpURLConnection.disconnect dopo averlo terminato usando

  1. Devo chiamare HttpURLConnection.disconnect, dopo l'arrivo il suo utilizzo?
  2. Devo chiamare InputStream.close?
  3. Devo chiamare InputStreamReader.close?
  4. È necessario disporre della seguente riga di codice 2: httpUrlConnection.setDoInput(true) e httpUrlConnection.setDoOutput(false), subito dopo la costruzione di httpUrlConnection?

Il motivo per cui lo chiedo è che la maggior parte degli esempi che ho visto non eseguono tale pulizia. http://www.exampledepot.com/egs/java.net/post.html e http://www.vogella.com/articles/AndroidNetworking/article.html. Voglio solo assicurarmi che anche quegli esempi siano corretti.


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

risposta

22

Sì, è necessario chiudere l'InputStream prima e vicino HttpConnection prossimo. Come da javadoc.

Ogni istanza HttpURLConnection viene utilizzata per effettuare una singola richiesta ma la connessione di rete sottostante al server HTTP può essere condivisa in modo trasparente da altre istanze. Chiamando i metodi close() su InputStream o OutputStream di un HttpURLConnection dopo una richiesta possono liberare risorse di rete associate a questa istanza ma non hanno alcun effetto su alcuna connessione persistente condivisa. La chiamata al metodo disconnect() può chiudere il socket sottostante se una connessione persistente è inattiva in quel momento.

Le prossime due domande di risposta dipendono dallo scopo della connessione. Leggi questo link per maggiori dettagli.

+0

Grazie. Pensi che ci siano degli errori nei due link tutorial sopra riportati dato che non chiamano disconnect? O mi sta sfuggendo qualcosa? –

+2

Non dico che sia un errore. Ma la disconnessione è un caso estremo (le operazioni di chiusura delle porte aperte sono costose), a meno che tu non voglia davvero non farlo. stream.close() rilascia la maggior parte delle risorse di rete e dovrebbe essere sufficiente. Di nuovo, se il tuo requisito è ok per creare socket ogni volta, non c'è nulla di sbagliato nel chiamare la disconnessione. – kosa

+0

Continuerò a fare richieste frequenti a un server quasi identico, e la perdita di memoria è la mia unica preoccupazione. Se capisco correttamente la documentazione, nel mio caso non è necessario chiamare la disconnessione. –

0

Credo che il requisito per chiamare setDoInput() o setDoOutput() sia quello di assicurarsi che vengano chiamati prima che qualcosa venga scritto o letto da uno streaming sulla connessione. Oltre a ciò, non sono sicuro che importi quando vengono chiamati quei metodi.

Problemi correlati