SOAPを使用してHTTPTransferからの応答を解析する際に、Androidでメモリ不足エラーを処理しようとしています。全体的に、私は大きなイメージを求めてくるまで、輸送はうまくいきます。画像は約901KBですが、なんらかの理由でAndroidの解析中にメモリ不足が発生します。コードは次のとおりです。XMLPullParserメモリ不足(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。この問題は、画像データ(Base64でエンコードされた文字列で私に送られます)を読み込み、parser.getText()を実行しようとするため、parser.next()を実行するときです。私がすべてを正しく理解している場合、文字列を出力する方法は、内部のstringbuilderを繰り返し呼び出すことで、解析された文字列を生成するまで.toString()を繰り返し続けます。問題の画像は約120万文字で、各文字が2バイトであることは2.4 MBを意味します(画像は901 KBですが、最初は解析されています)。しかし、このメソッドが呼び出されると、ヒープは16 MB以上に拡大され、アプリケーションが在庫VM設定でクラッシュするようになります。
私はこれが独特の状況であるとは思っていません。だから、他の人たちがこの問題をどのように処理したか聞くのが大好きです。私はたぶんSDカードのファイルに文字列を投げ捨ててメモリから外していると考えましたが、文字列を取得するためにparser.getTextが必要です。そこには問題があります。
がプルパーサー要件を使用している:この遭遇誰のための
は、私は最終的に私はここからアイデアを得た、SAXパーサーを使用して終了しますか? –
いいえ、それは既にコード内にあったものです。 – Criminosis
これに遭遇する人にとって、私は最終的にサックスパーサーを使用して終了しました。私はここからアイディアを得ました:http://www.helloandroid.com/tutorials/newsdroid-rss-reader – Criminosis