[英]Android OutOfMemoryError - Loading JSON File
我正在處理的應用程序需要讀取JSON文件,大小可能在1.5到3 MB之間。 打開文件並將數據轉換為字符串似乎沒有問題,但是當它嘗試將字符串轉換為JSONArray時,拋出OutOfMemoryErrors。 異常如下所示:
E/dalvikvm-heap( 5307): Out of memory on a 280-byte allocation.
W/dalvikvm( 5307): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;)
一件奇怪的事是,崩潰僅在應用程序運行第2或3次時才會發生,讓我相信應用程序消耗的內存不會在每次關閉時被垃圾回收。
我將如何解決這個問題的任何見解將不勝感激。 我對將文件分塊加載的想法持開放態度,但是我不確定執行此任務的最佳方法是什么。
謝謝
當您說“第二或第三次運行”時,您的意思是每次您從新的模擬器開始? 還是說離開應用程序然后回來? (例如,按下主屏幕或調用finalize())
如果您指的是退出應用程序並重新啟動它:
如果您未在清單中設置android:launchMode來將活動定義為singleInstance或singleTask,則每次啟動應用程序時,都會創建一個新活動並將其添加到活動堆棧中。 您很容易在應用程序流程中運行多個活動副本,從而消耗大量內存。
如果發生第二次啟動,您仍然會使用大量內存,應該將其分解得更多。
一件奇怪的事是,崩潰僅在應用程序運行第2或3次時才會發生,讓我相信應用程序消耗的內存不會在每次關閉時被垃圾回收。
這肯定是可能的,如果是這種情況,則可能是由於內存泄漏可以追溯到您的應用程序正在執行的操作。 我認為您應該將最初的工作重點放在調查這一方面上,而不是分批加載文件。 (我不熟悉Android工具鏈,但是我確定它包括內存使用情況分析器或內存轉儲分析器。)
編輯
在回應您的后續評論時,它有3次運行2次的事實表明您的應用程序應大致按原樣運行。 誠然,如果輸入文件變大,您沒有太多余地。
但是有兩個想法:
與其將文件讀入String並在String上運行JSON解析器,不如使用可以直接從流中讀取的解析器。 當前的解決方案在進行解析時需要空間來存儲內存中數據的兩個完整副本。
如果文件變得更大,則可能需要考慮一種無法創建數據的完整內存表示形式的設計。
我不確定以“塊”形式讀取JSON文件是否是一個好主意。 這可能會導致解析JSON的問題……具體取決於您通過分塊讀取的含義。
編輯2
也許您需要的是一個“ SAX like” JSON解析器; 例如http://code.google.com/p/async-json-library/
嘗試使用JsonReader在Android上有效地使用解析JSON數據。 就像XML的SAX解析一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.