2012-06-15 135 views
22

以下代碼基本上按預期工作。然而,要偏執,我想知道,以避免資源泄漏,完成使用後需要調用HttpURLConnection.disconnect

  1. 我需要調用HttpURLConnection.disconnect,完成後的使用情況如何?
  2. 我需要撥打InputStream.close嗎?
  3. 我需要撥打InputStreamReader.close嗎?
  4. 我是否需要以下2行代碼:httpUrlConnection.setDoInput(true)httpUrlConnection.setDoOutput(false),緊接着構建httpUrlConnection?

我這樣問的原因是我看到的大多數例子都沒有做這樣的清理。 http://www.exampledepot.com/egs/java.net/post.htmlhttp://www.vogella.com/articles/AndroidNetworking/article.html。我只是想確保這些例子是正確的。


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

回答

22

是的,你需要首先關閉InputStream和未來緊密的HttpConnection。根據javadoc

每個HttpURLConnection實例用於發出單個請求,但與HTTP服務器的底層網絡連接可能由其他實例透明共享。在請求後,在HttpURLConnection的InputStream或OutputStream上調用close()方法可釋放與此實例關聯的網絡資源,但對任何共享的持久連接均不起作用。如果此時持久連接處於空閒狀態,則調用disconnect()方法可能會關閉底層套接字。

下面兩個問題的答案取決於您的連接目的。閱讀link瞭解更多詳情。

+0

謝謝。你認爲上述兩個教程鏈接有錯誤,因爲它們不會調用斷開連接嗎?或者,我錯過了什麼? –

+2

我不認爲這是一個錯誤。但是,斷開連接是極端的情況(套接字關閉打開操作是昂貴的),除非你真的想我不會去做它。 stream.close()釋放大部分網絡資源,應該足夠了。同樣,如果您的要求可以每次都創建套接字,那麼在調用斷開連接時沒有任何問題。 – kosa

+0

我會不斷地向一個幾乎相同的服務器發出請求,內存泄漏是我唯一關心的問題。如果我正確理解文檔,則不需要在我的情況下調用斷開連接。 –

0

我相信調用setDoInput()或setDoOutput()的要求是爲了確保在連接上的任何流寫入或讀取之前調用它們。除此之外,當調用這些方法時,我不確定這很重要。