我正在使用 HttpURLConnection 来查询后端服务器。请求是 POST。我的代码如下所示:
InputStream is = null;
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection)new URL(uri).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + ENCODING);
connection.setDoOutput(true);
byte[] content = buildFormUrlEncoded(params);
connection.setRequestProperty("Content-Length", String.valueOf(content.length));
connection.connect();
OutputStream os = null;
try {
os = connection.getOutputStream();
os.write(content);
} finally {
if (os != null) { os.close(); }
}
is = connection.getInputStream();
handle(is);
} finally {
if (is != null) { is.close(); }
if (connection != null) { connection.disconnect(); }
}
但是我收到了这个 StrictMode 错误:
A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:300)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:164)
当我调试代码时,os.close()
,is.close()
和connection.disconnect()
被调用。
StrictMode 会因为连接在池中保持活动而发生吗?
编辑
- 如果
connection.setRequestProperty("connection", "close");
添加 StrictMode 错误消失。 - 如果使用 http URL 而不是 https URL,则 StrictMode 错误消失。
- 如果
BufferedReader
使用 StrictMode 错误发生的频率较低。
为了安全起见,我想保留 https 并保持活动状态以减少握手开销。
编辑 2
看起来这只发生在 android 3.X 和 4.0.X 的情况下。