繁体   English   中英

Android OutOfMemoryError-加载JSON文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM