2010-05-22 58 views
1

我正在使用的應用程序需要閱讀可能在1.5到3 MB大小的任何位置的JSON文件。打開文件並將數據轉換爲字符串似乎沒有問題,但是當它嘗試將字符串轉換爲JSONArray時,會引發OutOfMemoryErrors。唯一的例外是這個樣子:Android OutOfMemoryError - 加載JSON文件

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次,讓我相信,通過應用程序所消耗的內存不被垃圾每次應用程序關閉時收集。

任何深入瞭解我如何解決這個問題將不勝感激。我願意以大塊的形式加載文件,但我不太確定這樣的任務最好的方法是什麼。

謝謝

+3

了大量的資源在這裏:http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html – YGL 2010-05-22 02:01:55

+0

偉大的鏈接感謝! – JeremyFromEarth 2010-05-22 02:08:40

回答

2

這樣做的一個奇怪的是,崩潰只發生在應用程序運行的每2或第3次,讓我相信,通過應用程序所消耗的內存不被垃圾收集的各應用程序關閉的時間。

這當然是可能的,如果是的話,那麼它可能是由於可追溯到東西,你的應用程序在做內存泄漏。我認爲你應該將最初的努力集中在調查這方面......而不是將文件加載到塊中。 (我不熟悉Android工具鏈,但我相信它包括內存使用分析器或內存轉儲分析儀。)

編輯

在回答您的後續評論,事實上,它的工作原理3中的2次表明您的應用程序應該大致按原樣工作。無可否認,如果輸入文件變大,你沒有太大的餘地。

一對夫婦的想法,但:

  • 而不是把文件讀入一個字符串,並運行對字符串的JSON解析器,使用解析器,可以直接從流中讀取。當您解析時,您當前的解決方案需要在內存中留出兩個完整數據副本的空間。

  • 如果文件變得更大,您可能需要考慮一種設計,該設計不會創建數據的完整內存中表示。

我不確定讀「JUNK」中的JSON文件是個好主意。這可能會導致JSON解析出現問題......具體取決於您讀取塊的含義。

EDIT 2

也許你需要的是一個 「SAX像」 JSON解析器;例如http://code.google.com/p/async-json-library/

+0

你是否建議加載這麼多的數據應該是可行的呢?我一直在開發和關閉這個應用程序三個月,而且還沒有看到任何內存問題。我可以從字面上註釋掉將字符串轉換爲json數組的代碼行,並且所有內容都可以再次平穩運行。 – JeremyFromEarth 2010-05-22 02:02:28

+0

感謝您的想法!我同意試圖以塊讀取JSON似乎很麻煩。您對於不創建數據的多個副本也有很好的意見。 – JeremyFromEarth 2010-05-22 02:44:55

+0

我期待到建立從流JSON對象,將檢查出的異步JSON的庫如果流方法是行不通的。再次感謝! – JeremyFromEarth 2010-05-22 04:06:36

3

當你說「第二或第三次運行」時,你的意思是每當你用新的模擬器開始時?或者你的意思是離開應用程序並回來?(例如按HOME鍵,或調用完成())

如果你指的是離開應用程序,然後重新啓動它:

如果您沒有設置機器人:在你的清單launchMode定義活性singleInstance或singleTask,則每次啓動應用程序時都會創建一個新活動並將其添加到活動堆棧中。您可以輕鬆地在應用程序進程中運行多個活動副本,從而耗盡大量內存。

如果它發生的第二次推出的依然採用了大量的內存,並應該打破它更多。

+0

好點,但launchMode設置爲singleTask。 – JeremyFromEarth 2010-05-22 04:44:48

0

嘗試解析JSON數據有效地在Android上使用,使用JsonReader。這就像SAX解析XML。