2013-01-21 20 views
1

我有一個簡單的Android應用程序,從我的本地服務器上的PHP文件中讀取一些JSON數據。這很簡單,直到大約一個小時前它工作正常。然而,稍微休息一下(我甚至沒有打開我的電腦關閉)後,它突然什麼似乎像一個內存泄漏掙扎,雖然我沒有關於該問題的專家。Android應用程序發生內存泄漏?

我不知道爲什麼突然這樣的正在發生的事情,因爲我沒有改變任何代碼。但是,當我運行的應用程序我的logcat開始慢慢填補這樣的消息:

「GC_CONCURRENT中解脫出來,910K,53%免費3167K/6727K .....」

該應用程序最終運行,但只等待約1-2分鐘後。無論如何,我想知道是否有人可以檢查我的代碼,或者告訴我可能會導致這種情況發生。

public static JSONArray getJSONfromURL(String url) { 

    // initialize 
    InputStream is = null; 
    JSONArray jArray = null; 
    String result = ""; 

    // http post 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 

    } catch (Exception e) { 
     Log.e("log_tag", "Error in http connection " + e.toString()); 
    } 

    // convert response to string 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "utf-8"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result = sb.toString(); 

    } catch (Exception e) { 
     Log.e("log_tag", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jArray = new JSONArray(result);   
    } catch (JSONException e) { 
     Log.e("log_tag", "Error parsing data " + e.toString()); 
    } 

    return jArray; 
} 

JSON數據不是很大。

感謝您的任何建議。

+0

嘗試運行你的HTTP調用和JSON解析在異步任務 –

+0

好吧,謝謝。我對android開發很陌生,所以我想我有一些閱讀要做。這似乎很奇怪,這應該會突然開始發生,當時它工作得很好。 – user924014

+0

首先嚐試使用一個單獨的線程,或更好的是異步任務。其次,這是一個更好的方法來使用finally塊並關閉輸入流。第三內存泄漏可能是一些在你的代碼別的地方也是如此給一個外觀以及... –

回答

2
BufferedReader reader = new BufferedReader(new InputStreamReader(
      is, "utf-8"), 8); 

您已經分配了8個字節的緩衝區大小。這是非常小的。除非你真的知道你在做什麼,只要使用默認的大小與替換的單參數的構造函數:

public BufferedReader(Reader in) 
+0

唉唉,我明白了。謝謝。 – user924014

0

嗯,我改變了「而」循環,這和性能大幅提升:

int len; 
char[] chars = new char[4*1024]; 
while((len = reader.read(chars))>=0) { 
sb.append(chars, 0, len); 
} 

這仍然慢於我想,但至少我在正確的方向前進。我將繼續努力。感謝大家。