以下代码基本上按预期工作。然而,为了避免资源泄漏,我想知道是偏执狂,
HttpURLConnection.disconnect
?InputStream.close
?InputStreamReader.close
?httpUrlConnection.setDoInput(true)
和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);
}
}
}
答案 0 :(得分:22)
是的,您需要先关闭输入流,然后关闭httpconnection。根据{{3}}。
每个HttpURLConnection实例用于发出单个请求,但是与HTTP服务器的基础网络连接可以由其他实例透明地共享。在请求之后调用HttpURLConnection的InputStream或OutputStream上的close()方法可以释放与此实例关联的网络资源,但不会影响任何共享持久连接。如果此时持久连接处于空闲状态,则调用disconnect()方法可能会关闭底层套接字。
接下来的两个问题答案取决于您的连接目的。有关详细信息,请阅读此javadoc。
答案 1 :(得分:0)
我认为调用setDoInput()或setDoOutput()的要求是确保在向连接上的流写入或读取任何内容之前调用它们。除此之外,我不确定调用这些方法时是否重要。