【问题标题】:Android OutOfMemoryError with XML带有 XML 的 Android OutOfMemoryError
【发布时间】:2011-02-28 05:38:33
【问题描述】:

我正在构建一个从服务器获取 XML,然后对其进行解析的应用程序(它在某些地方采用 DIDL 格式)。目标是尽可能多地加载到内存中,以便用户更轻松地浏览(以便快速滚动浏览结果),但我不断收到OutOfMemoryErrors。我对 Android 有点陌生,似乎虚拟机对事情真的很挑剔。我加载的 XML 不超过一兆字节,并且几乎立即将其丢弃。我应该怎么做才能防止这些错误发生?

我是否应该通过网络逐块加载文件,将其写入磁盘,然后逐块加载进出内存,将所有内容解析为 POJO?如果可以避免,我希望不必根据 Twitter 应用程序实现某种形式的分页(它曾经在您触底时加载更多条目,现在它一次加载很多并且同样崩溃OOM 错误。)如果有帮助,我正在运行 Nexus One,CM7/Android 2.3.3。

【问题讨论】:

    标签: android networking io out-of-memory


    【解决方案1】:

    您可以阅读这篇关于 Android 上 XML 解析的精彩 article。使用拉解析器对您来说是一个不错的选择,因为它不需要将完整的文档读入内存,这是您的问题。我建议您将解析的结果存储到数据库中,因为一旦它们存在,您可以快速列出它们并以任何您想要的方式分页,并且数据库的性能非常好。这样,您只需将完整的数据从服务器加载到数据库一次(如果服务器上的数据没有更改),或者加载一次,然后在它发生变化时不时获取更新(例如推特)。

    【讨论】:

    • 这是有道理的。我想我会调查一下。我现在正在使用一个 API 来处理所有这些东西(解析、加载到内存等),所以我必须把它全部分解并弄清楚如何为此滚动我自己的 HTTP 请求并解析我的自己的结果,但是,是的,这是一个好的开始。它也肯定会提高应用程序的性能,以及逐个元素地解析事物并将它们添加到列表中。
    【解决方案2】:

    将所有对象声明移出循环并在使用后将其无效。并经常使用 System.gc() (相信我,它有效)。尽可能少地使用类级别的对象。执行您的应用程序并密切关注 Logcat 日志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多