1

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);
    }
}

ここでライブラリを見つけました。問題(私は信じています)は、画像データ(Base64でエンコードされた文字列で送信されます)を読み込んでから、parser.getText()を実行しようとするため、parser.next()を実行する場合です。文字列を出力する方法がすべて正しく理解されている場合は、内部の文字列ビルダーを繰り返し呼び出すことで、解析された文字列が生成されるまで.toString()を繰り返します。問題の画像は約120万文字で、各文字は2バイトなので、これを正しく理解していれば、2.4 MBを意味します(画像は元々901 KBですが、解析される余分なデータがあると思いますか?)。ただし、ヒープが16 MBを超えると、このメソッドが呼び出されたときにアプリがストックVM設定でクラッシュします。

これが独特の状況であるとは思えないので、他の人がこの問題をどのように処理したかを聞きたいと思います。SDカード上のファイルに文字列をスローしてメモリに入れないようにすることを考えましたが、文字列を取得するには、parser.getTextが必要なようです...そこに問題があります。

4

1 に答える 1

0

Stephan Branczykのコメントに従って、ここに私のコメントが抽出され、私の質問への回答としてマークされています。

これに出くわした人のために、私は最終的にサックスパーサーを使用することになりました、私はここからアイデアを得ました:helloandroid.com/tutorials/newsdroid-rss-reader

于 2014-02-21T00:03:27.253 に答える