在尝试使用SOAP解析来自HTTPTransfer的响应时,我一直试图处理Android中的内存不足错误。总的来说运输很好,直到我要求大图像。图像大小约为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);
}
}
我找到了图书馆here。问题(我相信)是它在解析.next()时,因为它读入图像数据(以Base64编码的字符串发送给我),然后尝试执行parser.getText()。如果我正确理解一切,它输出字符串的方式是通过重复调用内部stringbuilder,它将继续重复.toString()直到它生成解析后的字符串。有问题的图像是大约120万个字符,每个字符是2个字节,这意味着2.4 MB(图像虽然最初是901 KB ..但我想有额外的数据被解析?)如果我理解正确的话。但是,当调用此方法时,堆扩展到超过16 MB,这会导致应用程序在库存VM设置上崩溃。
我怀疑这是一种独特的情况,因此很想听听别人如何处理这个问题。我想过可能只是把字符串扔到SD卡上的一个文件中以防止它内存不足但似乎对我来说我需要解析字符串我需要parser.getText ......这就是问题所在。
答案 0 :(得分:0)
根据Stephan Branczyk的评论,我的评论被提取并标记为我的问题的答案。
对于遇到此问题的任何人,我最终都使用了萨克斯解析器,我从这里得到了这个想法:helloandroid.com/tutorials/newsdroid-rss-reader