0
我有其位於一個單獨的Java文件中的一個的AsyncTask(未內部類)以下代碼:機器人:在的AsyncTask內存泄漏
public class LastPriceRetrieval extends AsyncTask<String,Integer,String> {
private String itemName;
public LastPriceRetrieval() {
Utils.incAsync();
}
protected String doInBackground(String... strings) {
try {
itemName = strings[0];
URL url = new URL("<url>?q=" + itemName);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
InputStream in = conn.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
String body = stringBuilder.toString();
reader.close();
conn.disconnect();
if (!body.contains("\"price\"")) return "0";
else {
body = body.substring(body.indexOf("\"price\""));
body = body.substring(body.indexOf("=\"") + 2);
return body.substring(0, body.indexOf("\"") - 1);
}
} catch (Exception e) {
return "0";
}
}
protected void onPostExecute(String resLastPrice) {
if (Double.valueOf(resLastPrice) != 0) {
Utils.db.setLastPrice(itemName, Double.valueOf(resLastPrice));
}
Utils.decAsync();
}
}
的Utils類是如下(再次上的一個文件的自己的,而不是內部類)
public class Utils {
private static int asyncs = 0;
private static db = null;
public static synchronized void incAsync() {
asyncs++;
}
public static synchronized void decAsync() {
asyncs--;
}
public static int getAsyncs() {
return asyncs;
}
}
我調用上述的AsyncTask 60倍並聯(不同ITEMNAME)
new LastPriceRetrieval().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, itemName);
Utils.db是一個sqlite類,我在MainActivity的onCreate中實例化。當60個異步隊正在運行時,我什麼都不做,只是顯示一個ProgressDialog並等待它完成。
我運行內存監視器,當所有的60個asynctasks完成後,應用程序需要更多的內存比以前,這意味着什麼漏水,不知道爲什麼,或者是什麼。我錯過了什麼?
因爲每次調用(我試過連續3次),提出了內存使用情況,我不認爲強迫GC會工作。當60個呼叫正在處理時,我看到內存上下移動。我認爲它會在接近之前的數字之前冷靜下來,但是每個過程(60個電話)都會增加1-2mb。 – Amos
如果添加reader.close()之前in.close()是它使情況更好? –
的Javadoc:reader.close() - >關閉該流並釋放與之相關聯的所有系統資源。 – Amos