29

次のコードは、基本的に期待どおりに動作します。しかし、偏執的に、私は疑問に思っていました、リソースの漏れを避けるために、

  1. 使用後、に電話する必要がありHttpURLConnection.disconnectますか?
  2. 電話する必要がありますInputStream.closeか?
  3. 電話する必要がありますInputStreamReader.closeか?
  4. httpUrlConnection の作成直後にhttpUrlConnection.setDoInput(true)、次の 2 行のコードが必要ですか?httpUrlConnection.setDoOutput(false)

私がそう尋ねる理由は、私が見たほとんどの例がそのようなクリーンアップをしていないからです。http://www.exampledepot.com/egs/java.net/post.htmlおよびhttp://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);
        }
    }
}
4

2 に答える 2

24

はい、最初に入力ストリームを閉じ、次にhttpconnectionを閉じる必要があります。javadocによる。

各HttpURLConnectionインスタンスは、単一の要求を行うために使用されますが、HTTPサーバーへの基盤となるネットワーク接続は、他のインスタンスによって透過的に共有される場合があります。リクエスト後にHttpURLConnectionのInputStreamまたはOutputStreamでclose()メソッドを呼び出すと、このインスタンスに関連付けられているネットワークリソースが解放される場合がありますが、共有の永続的な接続には影響しません。その時点で持続的接続がアイドル状態である場合、disconnect()メソッドを呼び出すと、基になるソケットが閉じる可能性があります。

次の2つの質問の答えは、接続の目的によって異なります。詳細については、このリンクをお読みください。

于 2012-06-15T18:23:57.810 に答える
0

setDoInput() または setDoOutput() を呼び出すための要件は、接続上のストリームに何かが書き込まれたり読み取られたりする前にそれらが呼び出されることを確認することだと思います。それを超えて、それらのメソッドがいつ呼び出されるかが重要かどうかはわかりません。

于 2012-06-15T18:30:31.307 に答える