XMLPullParser内存不足(Android)

XMLPullParser内存不足(Android),android,soap,xmlpullparser,Android,Soap,Xmlpullparser,我一直在尝试处理Android中的内存不足错误,同时尝试使用SOAP解析来自HTTPTransfer的响应。总的来说,在我要求拍摄一张大图之前,交通状况良好。图像大小约为901KB,但由于某种原因,它会导致Android在解析图像时内存不足。代码如下: public void parseWithPullParser(InputStream is) { try { XmlPullParser parser = GenericHandler.createParser(thi

我一直在尝试处理Android中的内存不足错误,同时尝试使用SOAP解析来自HTTPTransfer的响应。总的来说,在我要求拍摄一张大图之前,交通状况良好。图像大小约为901KB,但由于某种原因,它会导致Android在解析图像时内存不足。代码如下:

public void parseWithPullParser(InputStream is) {
    try {

        XmlPullParser parser = GenericHandler.createParser(this.parserTypeName); // new
        // org.xmlpull.mxp1.MXParser();

        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
        parser.setInput(is, null);
        Log.d(TAG, "Name of class being parsed: " + resultClassName);
        for (int eventType = parser.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = parser
                .next()) {
            switch (eventType) {
            case XmlPullParser.START_DOCUMENT: {
                break;
            }
            case XmlPullParser.START_TAG: {
                String name = parser.getName();
                String prefix = null;
                if ("Envelope".equals(name) || "Header".equals(name) || "Body".equals(name)
                        || "return".equals(name)) {
                    prefix = "env:"; // TODO: Hack-Hack-Hack... :)
                }
                name = prefix == null ? name : prefix + ":" + name;
                this.startElement(name);
                break;
            }
            case XmlPullParser.TEXT: {
                String text = parser.getText();
                if (text != null) {
                    if (resultClassName.contains("ImageSingle")) {
                        Log.d(TAG, "Text passage: " + text);
                    }
                    if (content == null) {
                        content = new String();
                    }
                    content = text; // Original system used a string builder
                    // but only for a single section, for
                    // large images this was a problem, but
                    // a single string object appears to
                    // have the same affect
                    // char[] ch = text.toCharArray(); //original
                    // this.characters(ch, 0, ch.length); //original
                }
                break;
            }

            case XmlPullParser.END_TAG: {
                String name = parser.getName();
                String prefix = null;
                if ("Envelope".equals(name) || "Header".equals(name) || "Body".equals(name)
                        || "return".equals(name)) {
                    prefix = "env:"; // TODO: Hack-Hack-Hack... :)
                }
                name = prefix == null ? name : prefix + ":" + name;
                this.endElement(name);
                break;
            }
            default: {
                break;
            }
            }

        }
    } catch (Exception except) {
        Log.e(this.getClass().getSimpleName(), except.toString(), except);
    }
}
我找到了图书馆。问题(我相信)在于它何时执行parser.next(),因为它读入图像数据(以Base64编码字符串发送给我),然后尝试执行parser.getText()。如果我正确理解了所有内容,那么它输出字符串的方式就是重复调用内部stringbuilder,该内部stringbuilder将不断对自身重复.toString(),直到它生成已解析的字符串。所讨论的图像大约有120万个字符,每个字符有2个字节,这意味着2.4 MB(虽然图像最初是901 KB,但我想如果我理解正确,会有额外的数据被解析吗?)。但是当调用此方法时,堆扩展到超过16MB,这会导致应用程序在股票虚拟机设置上崩溃


我怀疑这是一种独特的情况,因此我很想听听其他人是如何处理这个问题的。我曾考虑过可能只是将字符串扔到SD卡上的一个文件中,以使其不在内存中,但对于我来说,似乎要获取字符串,我需要parser.getText…这就是问题所在。

根据Stephan Branchyk的评论,这里是我的评论摘要,并标记为我问题的答案


对于任何遇到此问题的人,我最终使用了sax解析器,我从这里得到了想法:

使用拉式解析器是一种要求吗?不,这只是代码中已经存在的内容。对于任何遇到此问题的人,我最终使用了sax解析器,我从这里得到了想法: