代码之家  ›  专栏  ›  技术社区  ›  JeremyFromEarth

Android OutofMemoryError-加载JSON文件

  •  1
  • JeremyFromEarth  · 技术社区  · 15 年前

    我正在开发的应用程序需要读取一个JSON文件,该文件的大小可以是1.5到3MB。打开文件并将数据转换为字符串似乎没有问题,但是当它尝试将字符串转换为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;)
    

    一个奇怪的事情是,崩溃只发生在应用程序运行的第二或第三次,让我相信应用程序消耗的内存不会在每次应用程序关闭时被垃圾收集。

    任何有关我如何解决这个问题的见解都将受到极大的赞赏。我同意将文件分块加载,但我不太确定这种任务的最佳方法是什么。

    谢谢你

    3 回复  |  直到 12 年前
        1
  •  2
  •   Stephen C    15 年前

    一个奇怪的事情是,崩溃只发生在应用程序运行的第二或第三次,让我相信应用程序消耗的内存不会在每次应用程序关闭时被垃圾收集。

    这当然是可能的,如果是这种情况,那么可能是由于内存泄漏,可以追溯到应用程序正在做的事情。我认为你应该把最初的努力集中在这方面…而不是成批地加载文件。(我不熟悉Android工具链,但我确信它包括内存使用分析程序或内存转储分析程序。)

    编辑

    作为对你后续评论的回应,事实上它在3中运行了2次,这意味着你的应用程序应该像现在这样运行。诚然,如果输入文件变大,您没有太多的余地。

    但是有几个想法:

    • 与其将文件读取到字符串中并在字符串上运行JSON解析器,不如使用可以直接从流中读取的解析器。在进行解析时,当前的解决方案需要空间来存放内存中数据的两个完整副本。

    • 如果文件变得更大,您可能需要考虑一种不会创建完整的内存中数据表示的设计。

    我不确定以“块”的形式读取JSON文件是否是一个好主意。这可能会在解析JSON时出现问题…取决于你所说的成批阅读。

    编辑2

    也许您需要一个“类似SAX”的JSON解析器;例如。 http://code.google.com/p/async-json-library/

        2
  •  3
  •   Mark    15 年前

    当你说“第二次或第三次运行”时,你的意思是每次你开始使用一个新的模拟器吗?或者你是说离开申请然后回来?(例如,按Home或调用Finalize())

    如果您提到要退出应用程序并重新启动它:

    如果您没有在清单中设置android:launchmode以将活动定义为singleinstance或singletask,那么每次启动应用程序时,都会创建一个新的活动并将其添加到活动堆栈中。您可以很容易地在应用程序进程中运行多个活动副本,从而占用大量内存。

    如果它发生在第二次发射时,你仍在使用大量的内存,应该把它分解得更多。

        3
  •  0
  •   Rafael Sanches    12 年前

    尝试使用jsonreader在Android上高效地使用parse-json数据。这就像XML的SAX解析。