Подтвердить что ты не робот

Мне нужно вызвать HttpURLConnection.disconnect после окончания использования

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

  • Нужно ли мне звонить HttpURLConnection.disconnect после завершения его использования?
  • Нужно ли мне звонить InputStream.close?
  • Нужно ли мне звонить InputStreamReader.close?
  • Нужно ли иметь следующую 2 строки кода: httpUrlConnection.setDoInput(true) и httpUrlConnection.setDoOutput(false), сразу после построения 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);
        }
    }
}
4b9b3361

Ответ 1

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

Каждый экземпляр HttpURLConnection используется для создания единого запроса, но базовое сетевое подключение к HTTP-серверу может быть прозрачно распространено другими экземплярами. Вызов методов close() в InputStream или OutputStream HttpURLConnection после запроса может освобождать сетевые ресурсы, связанные с этим экземпляром, но не влияет на какое-либо совместное постоянное соединение. Вызов метода disconnect() может закрыть базовый сокет, если постоянное соединение в это время не работает.

Следующий ответ на два вопроса зависит от цели вашего подключения. Подробнее см. Ссылку .

Ответ 2

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