2013-05-10 71 views
1

我必須從服務器下載大約6000條記錄到sqlite數據庫。記錄顯示爲JSON對象。使用BufferedReader檢索它們時,出現內存不足的異常。我搜索了很多網站,但無法找到合適的答案。請建議一些最佳解決方案。在從android服務器下載數據時出現異常內存異常

我的代碼是:

URL url = new URL("myurl"); 
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
//getting error here 
line = in.readLine(); 
System.out.println(line); 
JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(line); 
System.out.println("size : " + outerArray.size()); 

我得到了這個致命的異常 -

    E/AndroidRuntime(616): java.lang.OutOfMemoryError: [memory exhausted] 
+0

任務在主線程中調用,或者您創建了'Asyn'類來在後臺調用數據? – 2013-05-10 06:44:18

+0

你究竟在哪裏得到這個OutOfMemoryError?你有多少內存? – 2013-05-10 06:49:24

+0

任務正在主線程中調用.. – user2368920 2013-05-10 07:47:48

回答

1

你下載文件的大小是太多的內存來容納

嘗試做這樣的

// download the file 
       InputStream input = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream(); 

       byte data[] = new byte[1024]; 
       long total = 0; 
       int count; 
       while ((count = input.read(data)) != -1) { 
        total += count; 
        // publishing the progress.... 

        output.write(data, 0, count); 
       } 

       output.flush(); 
       output.close(); 
// 

更多解釋see this

此外

您應使用JSON流要麼GSON或傑克遜。有了傑克遜,你也可以採用混合方式。這將顯着減少你的內存消耗,因爲只有被解析的json部分被加載到內存中。

https://sites.google.com/site/gson/gson-user-guide

+0

感謝您的回覆..但我的錯誤信息是/sdcard/BarcodeScanner-debug.apk(權限被拒絕)。我是一個Android新手..你可以解釋這個問題.. – user2368920 2013-05-10 07:30:54

+0

這只是一個示例代碼,給一個本地文件路徑,而不是 – 2013-05-10 08:07:34

+0

我越來越錯誤作爲權限被拒絕..我必須做的? – user2368920 2013-05-10 09:40:27

0

似乎您試圖下載整個JSON數組中一氣呵成,並消耗大量的內存。嘗試讀取固定數量的緩衝塊(例如:1024)中的輸入,而不是執行readLine,如果這足以構建一個或多個JSON數組,則解析它。然後繼續閱讀下一個塊。這樣,你不是吹你的內存空間

請注意,此方法將只會工作,如果你能保證你的JSON數組元素將不會超過1024字節。否則,嘗試相應地調整這個數/使用可調數據結構

+0

謝謝..但我有一個單一的陣列中的所有6000條記錄...你能幫我嗎.. – user2368920 2013-05-10 07:28:41

+0

這很好。你的程序失敗的地方是它試圖一次解析所有6000個項目。請嘗試使用我的答案 – gerrytan 2013-05-11 16:29:45