我正在使用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? p>
修改
connection.setRequestProperty("connection", "close");
,则StrictMode错误消失。BufferedReader
,则StrictMode错误发生次数较少。我想保持https的安全性并保持活力以减少握手开销。
编辑2
看起来这只发生在android 3.X和4.0.X。
的情况下答案 0 :(得分:2)
我的代码如下所示:
@Override
protected Boolean doInBackground(Void... params) {
JSONObject holder = new JSONObject();
try {
Resources res = getResources();
holder.put(res.getString(R.string.str),"");
URL url = new URL(res.getString(R.string.url));
String charset = res.getString(R.string.utf);
HttpURLConnection http = null;
HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
http = https;
http.setRequestMethod(res.getString(R.string.post));
http.setDoInput(true);
http.setDoOutput(true);
http.setRequestProperty(res.getString(R.string.charset), charset);
http.setRequestProperty(res.getString(R.string.content_type), "application/x-www-form-urlencoded;charset=" + charset);
String query = String.format("query1=%s&query2=%s&query3=%s&query4=%s",
URLEncoder.encode(res.getString(R.string.qu1), charset),
URLEncoder.encode(res.getString(R.string.qu2), charset),
URLEncoder.encode(res.getString(R.string.qu3), charset),
URLEncoder.encode(holder.toString(), charset));
OutputStream output = null;
try {
output = http.getOutputStream();
output.write(query.getBytes(charset));
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
//InputStream response = http.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(http.getInputStream()),4800);
StringBuffer responseBuffer = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
responseBuffer.append(line);
}
in.close();
answer = new Gson().fromJson(responseBuffer.toString(), Answer.class);
//s = responseBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
getData();
}
return true;
}
我相信你会在那里找到答案。
答案 1 :(得分:1)
尝试以下方法,
关闭流和连接后,然后为null。
is=null;os=null;connection=null;