2017-06-18 32 views
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完成後,應用程序需要更多的內存比以前,這意味着什麼漏水,不知道爲什麼,或者是什麼。我錯過了什麼?

回答

0

也許調用GC()試圖測試內存泄露過嗎?

+0

因爲每次調用(我試過連續3次),提出了內存使用情況,我不認爲強迫GC會工作。當60個呼叫正在處理時,我看到內存上下移動。我認爲它會在接近之前的數字之前冷靜下來,但是每個過程(60個電話)都會增加1-2mb。 – Amos

+0

如果添加reader.close()之前in.close()是它使情況更好? –

+0

的Javadoc:reader.close() - >關閉該流並釋放與之相關聯的所有系統資源。 – Amos