java - Android OutOfMemoryError - 加载 JSON 文件

标签 java android json crash memory-management

我正在开发的应用程序需要读取一个大小可能在 1.5 到 3 MB 之间的 JSON 文件。打开文件并将数据转换为字符串似乎没有问题,但是当它尝试将字符串转换为 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 次时发生,这让我相信应用程序消耗的内存不会在每次应用程序关闭时被垃圾回收。

如能深入了解我如何解决此问题,我们将不胜感激。我对分块加载文件的想法持开放态度,但我不太确定完成此类任务的最佳方法是什么。

谢谢

最佳答案

当你说“第 2 次或第 3 次运行”时,你的意思是每次你都从一个新的模拟器开始吗?或者你的意思是离开应用程序然后回来? (例如按下主页,或调用 finalize() )

如果您指的是离开应用程序并重新启动它:

如果您尚未在 list 中设置 android:launchMode 以将 Activity 定义为 singleInstance 或 singleTask,则每次启动应用程序时都会创建一个新 Activity 并将其添加到 Activity 堆栈中。您可以很容易地在您的应用程序进程中运行多个 Activity 副本,从而占用大量内存。

如果它发生在第二次启动时,您仍然使用大量内存并且应该将其分解更多。

关于java - Android OutOfMemoryError - 加载 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886599/

相关文章:

java - 如何简单地对ArrayList<>的元素进行统计操作

android - 使用GSON存储在Android中解析的Json

php - Pluck id(整数)转换为字符串 Laravel

android - 我可以在 android 的 ListView Activity 中有多个列表吗

javascript - 使用带有嵌套 "list"的 .NET deserialize() 进行 JSON 解析

java - OnGesturePerformedListener 错误 - Android

java - 使用多个类的不兼容返回类型

java - SAS 语言提供的宏编程有什么好处?

android - 圆形图标在 Android Studio 3.0 中没有改变

java - 如何区分不同的wifi网络?