2017-01-02 52 views
1

我似乎有以下的AsyncTask內存泄漏,有哪些可能的原因呢?內存泄漏的AsyncTask

/** 
* Async task class to get json by making HTTP call 
* */ 
public class PostLocation extends AsyncTask<String, Void, String> 
{ 

    @Override 
    protected void onPreExecute() 
    { 

    } 
    @Override 
    protected String doInBackground(String... params) 
    { 
     try 
     { 
      String response = ""; 



      URL url = new URL(BASE_URL + "receiveLocation.php"); 

      myConnection = (HttpURLConnection) url.openConnection(); 
      myConnection.setRequestMethod("POST"); 
      myConnection.setDoOutput(true); 

      DataOutputStream wr = new DataOutputStream(myConnection.getOutputStream()); 

      wr.writeBytes(params[0]); 
      int responseCode = myConnection.getResponseCode(); 

      if (responseCode == HttpsURLConnection.HTTP_OK) 
      { 
       String line; 
       BufferedReader br = new BufferedReader(new InputStreamReader(myConnection.getInputStream())); 
       while ((line = br.readLine()) != null) 
       { 
        response += line; 
       } 
      } 
      else 
      { 
       return response = ""; 
      } 
      return response; 


     } 
     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return "false"; 
     } 
    } 
    @Override 
    protected void onPostExecute(String result) 
    { 
     if(result.equals("success")) 
     { 
      myConnection.disconnect(); 
     } 


    } 

} 

這只是發佈一些數據到我的服務器。這可能是造成內存泄漏,請注意這個任務被稱爲在使用goAsync

+0

加入logcat的將給予更多的信息。 –

+0

這個類放在一個單獨的.java文件中,還是嵌套類? – Kelevandos

+0

@Kelevandos這是我的廣播接收器中的內部類 – Rob85

回答

3

這裏的問題是在你的類結構的廣播接收器的背景。

嵌套類應該聲明靜態只要有可能,否則將保留封閉類的內存,導致內存泄漏。

變化:

public class PostLocation extends AsyncTask<String, Void, String> 

到:

public static class PostLocation extends AsyncTask<String, Void, String> 

這裏是一個練習:

  • 將一個領域在廣播接收器類叫做boolean test現在
  • 在嵌套類,嘗試訪問這個領域,例如test == true

如果嵌套類是不是一成不變的,您將能夠訪問該字段。這是因爲該類的實例保留對封閉類的引用。但是,如果你PostLocation靜態,本場將無法使用。

+0

我所做的都在這裏的答案,但這個任務每次調用了大約0.1萬桶提高內存的使用和這個調用運行,每3分鐘,如果我刪除調用它不會增加 – Rob85

1

是的,你需要首先關閉InputStream和關閉HttpConnection的未來。根據javadoc

每個HttpURLConnection實例是用來製造一個單個的請求,但是 基礎網絡連接到HTTP服務器可以是 通過其他實例透明共享。調用 請求之後的關閉()方法 上的HttpURLConnection類的InputStream的或可能的OutputStream釋放與此實例相關聯的網絡資源,但 對任何共享的持久連接沒有影響。如果持續的連接在此時處於空閒狀態,則調用 disconnect()方法可能會關閉底層套接字。有關問題的請求添加它

Source

+0

考慮另一個答案考慮我不能關閉連接,就像我做的上面如果類是靜態的,或者我只是使連接和輸入流靜態?在「br」之前嘗試關閉 – Rob85

+0

。''在'return return;'之前''在'doInBackground'中 –

+0

我在這裏做了兩個答案,但是每次調用這個任務都會增加RAM的使用量大約0.1mb,並且這個調用每3分鐘運行一次,它不會增加 – Rob85