Android:asynctask中的内存泄漏

时间:2017-06-18 08:46:18

标签: android memory-leaks android-asynctask

我有一个AsyncTask的代码,它位于一个单独的Java文件(不是内部类)上:

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个asynctasks正在运行时我什么都不做,只显示一个ProgressDialog并等待它完成。

我运行一个内存监视器,当所有60个asynctasks完成后,应用程序需要比以前更多的内存,这意味着某些东西正在泄漏,不知道为什么或什么。我错过了什么?

1 个答案:

答案 0 :(得分:0)

在尝试测试内存泄漏之前,可能会调用gc()吗?