完成使用后我是否需要调用HttpURLConnection.disconnect

时间:2012-06-15 18:14:43

标签: android

以下代码基本上按预期工作。然而,为了避免资源泄漏,我想知道是偏执狂,

  1. 完成使用后,是否需要致电HttpURLConnection.disconnect
  2. 我是否需要致电InputStream.close
  3. 我是否需要致电InputStreamReader.close
  4. 我是否需要在构建httpUrlConnection之后拥有以下两行代码:httpUrlConnection.setDoInput(true)httpUrlConnection.setDoOutput(false)
  5. 我之所以这么说,我看到的大部分例子都没有做过这样的清理工作。 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);
            }
        }
    }
    

2 个答案:

答案 0 :(得分:22)

是的,您需要先关闭输入流,然后关闭httpconnection。根据{{​​3}}。

  

每个HttpURLConnection实例用于发出单个请求,但是与HTTP服务器的基础网络连接可以由其他实例透明地共享。在请求之后调用HttpURLConnection的InputStream或OutputStream上的close()方法可以释放与此实例关联的网络资源,但不会影响任何共享持久连接。如果此时持久连接处于空闲状态,则调用disconnect()方法可能会关闭底层套接字。

接下来的两个问题答案取决于您的连接目的。有关详细信息,请阅读此javadoc

答案 1 :(得分:0)

我认为调用setDoInput()或setDoOutput()的要求是确保在向连接上的流写入或读取任何内容之前调用它们。除此之外,我不确定调用这些方法时是否重要。