Android OutOfMemoryError

3

当我使用SAXParser解析大型XML文件时,我的应用程序崩溃了。
我在SO上找到了一个相关的问题(点击此处),但是没有得到答案。
当我减小XML的大小时,它按预期工作。
以下是我的LogCat输出。

11-26 12:08:45.099: WARN/dalvikvm(218): threadid=17: thread exiting with uncaught exception (group=0x4001aa28)
11-26 12:08:45.109: ERROR/AndroidRuntime(218): Uncaught handler: thread Thread-9 exiting due to uncaught exception
11-26 12:08:45.220: ERROR/AndroidRuntime(218): java.lang.OutOfMemoryError
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at java.lang.Object.internalClone(Native Method)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at java.lang.Object.clone(Object.java:82)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:141)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at java.lang.StringBuilder.append(StringBuilder.java:282)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at   com.google.android.iopex.SaxXMLHandler.characters(SaxXMLHandler.java:24)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatParser.text(ExpatParser.java:166)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatParser.append(Native Method)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:506)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at javax.xml.parsers.SAXParser.parse(SAXParser.java:361)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at javax.xml.parsers.SAXParser.parse(SAXParser.java:240)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at com.google.android.iopex.SaxParser.parse(SaxParser.java:22)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at com.google.android.iopex.iOPEXActivity$4.run(iOPEXActivity.java:112)
11-26 12:08:45.220: ERROR/AndroidRuntime(218):     at java.lang.Thread.run(Thread.java:1060)

这里是我用来解析的代码。请点击这里查看。

你能否使用SQLite数据库而不是XML文件来存储数据? - EboMike
我正在解析XML文件并将其存储到SqliteDB中,伙计! - Ajith
3
我不确定是解析本身导致的还是将内容存储在List<DbEntry>列表中变得太大导致的。如果是后者,尝试直接将数据推送到sqlite数据库而不是存储在List<DbEntry>中。这可能效率会降低,但对于大量记录可能是更好的解决方案。或者缓存20-30个条目并将它们刷新到数据库中,清空列表并缓存另外的20-30个条目。 - Tseng
谢谢,伙计。我的 List<DbEntry> 变得非常庞大了...问题解决了。 - Ajith
1个回答

1

Android有堆限制,从文件中以块的形式读取XML数据并方便地解析它。

Ninja编辑:

根据 Tseng的说法:通过读取20-30个条目将List<DbEntry>缓存在其中,这样做更有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接