android - XML解析java.lang.OutOfMemoryError : [memory exhausted]

标签 android android-layout

你好,我正在通过下面的代码解析 xml

       @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    InputStream is = getResources().openRawResource(R.raw.bd);
    try {
        DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = docBuilder.parse(is, null);
        doc.getDocumentElement().normalize();
        NodeList my_words = doc.getElementsByTagName("word");
        for (int i = 0; i < 100; i++) {
            System.out.println(((Element) my_words.item(i)).getAttribute("eng"));
            System.out.println(((Element) my_words.item(i)).getAttribute("guj"));
        }
        is.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

但我收到如下错误...

          01-11 16:00:48.709: E/dalvikvm-heap(18535): Out of memory on a 176-byte allocation.
          01-11 16:00:48.709: I/dalvikvm(18535): "main" prio=5 tid=1 RUNNABLE
          01-11 16:00:48.709: I/dalvikvm(18535):   | group="main" sCount=0 dsCount=0 obj=0x40022190 self=0xd018
          01-11 16:00:48.709: I/dalvikvm(18535):   | sysTid=18535 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345002400
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.Throwable.nativeFillInStackTrace(Native Method)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.Throwable.fillInStackTrace(Throwable.java:135)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.Throwable.<init>(Throwable.java:74)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.Error.<init>(Error.java:38)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.VirtualMachineError.<init>(VirtualMachineError.java:36)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:34)
          01-11 16:00:48.709: I/dalvikvm(18535):   at java.util.ArrayList.add(ArrayList.java:-1)
          01-11 16:00:48.709: I/dalvikvm(18535):   at org.apache.harmony.xml.dom.ElementImpl.setAttributeNode(ElementImpl.java:329)
          01-11 16:00:48.709: I/dalvikvm(18535):   at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:355)
          01-11 16:00:48.709: I/dalvikvm(18535):   at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:360)
          01-11 16:00:48.709: I/dalvikvm(18535):   at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:133)
          01-11 16:00:48.709: I/dalvikvm(18535):   at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:132)
          01-11 16:00:48.709: I/dalvikvm(18535):   at com.example.simplexmlpullapp.MainActivity.onCreate(MainActivity.java:32)
          01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
          01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
          01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
          01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.ActivityThread.access$1500(ActivityThread.java:123)
         01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
         01-11 16:00:48.709: I/dalvikvm(18535):   at android.os.Handler.dispatchMessage(Handler.java:99)
         01-11 16:00:48.709: I/dalvikvm(18535):   at android.os.Looper.loop(Looper.java:130)
         01-11 16:00:48.709: I/dalvikvm(18535):   at android.app.ActivityThread.main(ActivityThread.java:3835)
         01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.reflect.Method.invokeNative(Native Method)
         01-11 16:00:48.709: I/dalvikvm(18535):   at java.lang.reflect.Method.invoke(Method.java:507)
         01-11 16:00:48.709: I/dalvikvm(18535):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
         01-11 16:00:48.709: I/dalvikvm(18535):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
         01-11 16:00:48.709: I/dalvikvm(18535):   at dalvik.system.NativeStart.main(Native Method)
         01-11 16:00:48.729: W/dalvikvm(18535): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;)
        01-11 16:00:48.729: W/dalvikvm(18535): Could not resolve class ref'ed in exception catch list (class index 349, exception Ljava/lang/OutOfMemoryError;)
        01-11 16:00:49.209: I/dalvikvm-heap(18535): Clamp target GC heap from 25.906MB to 24.000MB
        01-11 16:00:49.209: D/dalvikvm(18535): GC_CONCURRENT freed <1K, 11% free 22006K/24519K, external 3K/514K, paused 5ms+6ms
        01-11 16:00:49.509: D/dalvikvm(18535): GC_FOR_MALLOC freed 19308K, 89% free 2698K/24519K, external 3K/514K, paused 294ms
        01-11 16:00:49.509: D/AndroidRuntime(18535): Shutting down VM
        01-11 16:00:49.509: W/dalvikvm(18535): threadid=1: thread exiting with uncaught exception (group=0x40018560)
        01-11 16:00:49.509: E/AndroidRuntime(18535): FATAL EXCEPTION: main
        01-11 16:00:49.509: E/AndroidRuntime(18535): java.lang.OutOfMemoryError: [memory exhausted]
        01-11 16:00:49.509: E/AndroidRuntime(18535):    at dalvik.system.NativeStart.main(Native Method)

最佳答案

Java 中的 SAX XML 解析器

SAX 代表用于 XML 解析的简单 API。这是一个基于事件的 XML 解析,它一步一步地解析 XML 文件,非常适合大型 XML 文件。 SAX XML 解析器在遇到开始标记、元素或属性时会触发事件,并且解析会相应地进行。建议使用 SAX XML 解析器来解析 Java 中的大型 xml 文件,因为它不需要在 Java 中加载整个 XML 文件,并且它可以读取小部分的大 XML 文件。 Java 提供对 SAX 解析器的支持,您可以使用 SAX 解析器解析 Java 中的任何 xml 文件,我在这里介绍了使用 SAX 解析器读取 xml 文件的示例。在 Java 中使用 SAX 解析器的一个缺点是,与 DOM 解析器相比,使用 SAX 解析器在 Java 中读取 XML 文件需要更多代码。

DOM 和 SAX XML 解析器的区别 以下是 Java 中的 DOM 解析器和 SAX 解析器之间的一些高级差异:

1) DOM 解析器在内存中加载整个 xml 文档,而 SAX 只在内存中加载一小部分 XML 文件。

2) DOM 解析器比 SAX 更快,因为它访问内存中的整个 XML 文档。

3) Java 中的 SAX 解析器比 DOM 解析器更适合大型 XML 文件,因为它不需要太多内存。

4) DOM 解析器在文档对象模型上工作,而 SAX 是基于事件的 xml 解析器。

这就是 Java 中 SAX 和 DOM 解析器之间的区别,现在由您决定选择哪种 XML 解析器。如果 XML 文件足够小,我建议使用 DOM 解析器而不是 SAX 解析器;如果您不知道要处理的 xml 文件的大小或它们很大,我建议使用 SAX 解析器。

关于android - XML解析java.lang.OutOfMemoryError : [memory exhausted],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276265/

相关文章:

java - 在抽屉导航中禁用暗淡化

java - 如何在约束布局中以编程方式移动 View (按钮)?

android - SwipeRefreshLayout - 向下滑动刷新但不移动 View 下拉

android - 在自定义 View 类中的何处设置自定义字体(扩展按钮)?

java - 基本蓝牙应用程序无法运行

android - 具有固定宽度子项的 ViewPager

android - 应用程序正在运行但 MAP 是空白的我正在使用 google map api 来定位某个位置

Android - 如果没有空间,请向下移动按钮

java - Android viewholder 类范围广

java - 通过多个函数返回