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

Che*_*eng 26 android

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

  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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

kos*_*osa 23

是的,您需要先关闭输入流,然后关闭httpconnection.按照javadoc.

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

接下来的两个问题答案取决于您的连接目的.阅读此链接了解更多详情.

  • 我不是说这是一个错误.但是,断开是极端的情况(套接字关闭打开操作是昂贵的),除非你真的想要我不会去.stream.close()释放大部分网络资源,应该足够了.同样,如果你的要求可以每次都创建套接字,那么调用disconnect是没有错的. (2认同)