我有以下代碼(安卓4.0):HttpURLConnection類不免費資源
private HttpURLConnection conn = null;
private synchronized String downloadUrl(String myurl) {
InputStream is = null;
BufferedReader _bufferReader = null;
try {
URL url_service = new URL(.....);
System.setProperty("http.keepAlive", "false");
System.setProperty("http.maxConnections", "5");
conn = (HttpURLConnection) url_service.openConnection();
conn.setReadTimeout(DataHandler.TIME_OUT);
conn.setConnectTimeout(DataHandler.TIME_OUT);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("connection", "close");
conn.setInstanceFollowRedirects(false);
conn.connect();
StringBuilder total = null;
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = conn.getInputStream();
_bufferReader = new BufferedReader(new InputStreamReader(is));
total = new StringBuilder();
String line;
while ((line = _bufferReader.readLine()) != null) {
total.append(line);
}
} else {
onDomainError();
}
return total.toString();
} catch (SocketTimeoutException ste) {
onDomainError();
} catch (Exception e) {
onDomainError();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
if (_bufferReader != null) {
try {
_bufferReader.close();
} catch (Exception e) {
// TODO: handle exception
}
}
if (conn != null)
conn.disconnect();
conn = null;
}
return null;
}
.disconnect()
時,保活設置爲false和最大連接數設置爲5。但是,如果出現SocketTimeout
exception
,連接不會關閉,設備很快就會出現內存不足的情況。這怎麼可能?
另外,根據http://developer.android.com/reference/java/net/HttpURLConnection.html,HttpURLConnection
應disconnect()
關閉連接,如果保活設置爲false
和重用它時,保活是true
。這些方法都不適用於我。任何想法可能是錯的?
我: - 移動「康恩」的方法 內聲明 - - 在方法 的開始搬家「http.keepalive」和「http.maxConnections」命令刪除「is.close()」命令 但是,問題依然存在。 你有什麼想法可能是錯了嗎?有趣的是,只有當連接到服務器失敗時纔會出現問題(超時)。 –
1)你有沒有明確的證據,這個問題是漏水的HTTP連接?或者這只是一個理論? 2)你是否在第2號子彈中考慮過這個問題?您的應用是否使用多個線程進行下載? –
廣告1)是的。 MAT for Eclipse顯示:由「<系統類加載器>」加載的「libcore.net.http.HttpURLConnectionImpl」的568個實例佔用1.448.712(15,07%)個字節。 廣告2)是,我「運動參數conn」變量** **內的方法,但問題仍然存在。 廣告3)應用程序使用的AsyncTask用於此目的,所以它是** **可能有被同時執行,該方法的多個實例。 –