Нужно ли вызывать HttpURLConnection.disconnect после того, как вы его используете?

Следующий код в основном работает как положено. Однако, чтобы быть параноиком, мне было интересно, чтобы избежать утечки ресурсов,

Do I need to call HttpURLConnection.disconnect, after finish its usage? Do I need to call InputStream.close? Do I need to call InputStreamReader.close? Do I need to have the following 2 line of code : httpUrlConnection.setDoInput(true) and httpUrlConnection.setDoOutput(false), just after the construction of httpUrlConnection?

Причина, по которой я спрашиваю, состоит в том, что большинство примеров, которые я видел, не выполняют такую очистку.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);
        }
    }
}

Ответы на вопрос(2)

Решение Вопроса

Да, вам нужно сначала закрыть входной поток и затем закрыть httpconnection. СогласноJavadoc.

Each HttpURLConnection instance is used to make a single request but the underlying network connection to the HTTP server may be transparently shared by other instances. Calling the close() methods on the InputStream or OutputStream of an HttpURLConnection after a request may free network resources associated with this instance but has no effect on any shared persistent connection. Calling the disconnect() method may close the underlying socket if a persistent connection is otherwise idle at that time.

Ответ на следующие два вопроса зависит от цели вашей связи. Прочитай этоссылка на сайтБольше подробностей.

 07 нояб. 2013 г., 12:10
Используя Android 4.4, я получаюorg.eclipse.jetty.io.EofException: early EOF исключение при потоковой передаче данных сигнала сервлет-контейнеру Jetty 8.1.11 и отключении HttpUrlConnection после закрытия модуля записи выходного потока. Исключение исчезает, когда я удаляю вызовdisconnect и только закройте выходной поток.Can someone confirm this behaviour? На Android 4.2 работает как положено, закрывая поток и отключая HttpUrlConnection
 02 нояб. 2015 г., 09:56
В соответствии сthe docsпозвониdisconnectи они не закрывают входные потоки в примере, которые предполагают, чтоdisconnect делает это для вас.
 Cheok Yan Cheng15 июн. 2012 г., 20:42
Я буду часто делать запросы почти к одному и тому же серверу, и утечка памяти - моя единственная проблема. Если я правильно понимаю документацию, в моем случае нет необходимости вызывать разъединение.
 Cheok Yan Cheng15 июн. 2012 г., 20:29
Благодарю. Как вы думаете, есть ли ошибки в двух приведенных выше ссылках на учебники, поскольку они не вызывают разъединение? Или я что-то упустил?
 15 июн. 2012 г., 20:33
Я не говорю, что это ошибка. Но отключение - это крайний случай (операции открытия сокета обходятся дорого), если только вы действительно не хотите, чтобы я не пошел на это. stream.close () освобождает большинство сетевых ресурсов и должно быть достаточно. Опять же, если ваше требование в том, чтобы каждый раз создавать сокеты, нет ничего плохого в вызове connect.

Я полагаю, что требование для вызова setDoInput () или setDoOutput () должно гарантировать, что они вызываются до того, как что-либо будет записано или прочитано из потока в соединении. Кроме того, я не уверен, имеет ли значение, когда эти методы вызываются.

Ваш ответ на вопрос