1

私は実際に初めて SAX Parser を使用しています。ここのチュートリアルと質問から、ほとんどのことを理解できました。現在、ほとんどすべてが正常に機能しています。しかし、私にはまだ 1 つの問題があります。logcat を解析すると、多くのガベージ コレクター ログが表示されます。また、grow heap メッセージが発生することもあります。これが発生すると、常に間違ったアイテムが作成されます。おそらく、誰かが最適化の提案を持っています。

これは、ハンドラーの文字メソッドのコードです。パーサーは常に完全なファイルを解析し、その後、見つかったすべての項目が sqlite テーブルに格納されます。

public void characters(char ch[], int start, int length) {
    //decide wich tag is active, process string

    String parse = new String(ch, start, length);

    if(in_starttag)
    {
        currentItem = new Item();
        in_starttag = false;
    }
    else if(in_mainclasstag)
    {
        if(cats.indexOf(parse) == -1)
        {
            cats.add(parse);

            currentMain = new EgrohItem((categories.size()+1), parse, 1, -1);
            categories.add(currentMain);
        }
        else
        {
            currentMain = categories.get(cats.indexOf(parse));
        }
    }
    else if(in_midclasstag)
    {
        if(cats.indexOf(parse) == -1)
        {
            cats.add(parse);
            currentMid = new EgrohItem((categories.size()+1), parse, 0, currentMain.getId());
            categories.add(currentMid);
        }
        else
        {
            currentMid = categories.get(cats.indexOf(parse));
        }
    }
    else if(in_subclasstag)
    {
        if(cats.indexOf(parse) == -1)
        {
            cats.add(parse);
            currentSub = new EgrohItem((categories.size()+1), parse, 0, currentMid.getId());
            categories.add(currentSub);
        }
        else
        {
            currentSub = categories.get(cats.indexOf(parse));
        }
        currentItem.setAbove_cat(currentMain.getId());
    }
    else if(in_idtag)
    {
        currentItem.setArt_nr(parse);
    }
    else if(in_destag1)
    {
        if(currentItem.getName() != null)
        {
            currentItem.setName(currentItem.getName() + parse);
        }
        else currentItem.setName(parse);
    }
    else if(in_destag2)
    {
        if(currentItem.getName() != null)
        {
            currentItem.setName(currentItem.getName() + parse);
        }
        else currentItem.setName(parse);
    }
    else if(in_destag3)
    {
        if(currentItem.getName() != null)
        {
            currentItem.setName(currentItem.getName() + parse);
        }
        else currentItem.setName(parse);
    }
    else if(in_destag4)
    {
        if(currentItem.getName() != null)
        {
            currentItem.setName(currentItem.getName() + parse);
        }
        else currentItem.setName(parse);
    }
    else if(in_descriptag)
    {
        if(currentItem.getDescription() != null)
        {
            String des = currentItem.getDescription()+" "+parse;
            currentItem.setDescription(des);
        }
        else currentItem.setDescription(parse);
    }
    else if(in_eantag)
    {
        currentItem.setEan(parse);
    }
    else if(in_suppnrtag)
    {
        currentItem.setSupp_nr(parse);
    }
    else if(in_supptag)
    {
        currentItem.setSupplier(parse);
    }
    else if(in_acctag1)
    {
        currentAcc_Nr = parse;
        currentItem.setAccessories_number(currentAcc_Nr);
    }
    else if(in_acctag2)
    {
        if(parse.length()>0 && !parse.equals(" "))
        {
            currentAcc_Nr += parse;
        }
        currentItem.setAccessories_number(currentAcc_Nr);
    }
    else if(in_acctag3)
    {
        if(parse.length()>0 && !parse.equals(" "))
        {
            currentAcc_Nr += parse;
        }
        currentItem.setAccessories_number(currentAcc_Nr);
    }
    else if(in_acctag4)
    {
        if(parse.length()>0 && !parse.equals(" "))
        {
            currentAcc_Nr += parse;
        }
        currentItem.setAccessories_number(currentAcc_Nr);
    }
    else if(in_amount1tag)
    {
        Integer amo1 = new Integer(parse);
        currentItem.setAmo1(amo1);
    }
    else if(in_amount2tag)
    {
        Integer amo2 = new Integer(parse);
        if(amo2 > 0) currentItem.setAmo2(amo2);
    }
    else if(in_amount3tag)
    {
        Integer amo3 = new Integer(parse);
        if(amo3 > 0) currentItem.setAmo3(amo3);
    }
    else if(in_price1tag)
    {
        currentItem.setPrice1(parse);
    }
    else if(in_price2tag)
    {
        if(!parse.equals("0")) currentItem.setPrice2(parse);
    }
    else if(in_price3tag)
    {
        if(!parse.equals("0")) currentItem.setPrice3(parse);
    }
    else if(in_mctag)
    {
        categories.get(currentMain.getId()-1).setName(parse);
    }
    else if(in_mictag)
    {
        categories.get(currentMid.getId()-1).setName(parse);
    }
}

解析が開始される部分: try { URL src = new URL(src_url); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser();

        XMLReader xr = sp.getXMLReader();
        MedExampleHandler meh = new MedExampleHandler(prefcon);
        xr.setContentHandler(meh);
        BufferedInputStream bis = new BufferedInputStream(src.openStream(), 200);
        InputSource is = new InputSource(bis);
        xr.parse(is);

        categories = meh.getCategories();
    }
    catch (Exception e)
    {
        Log.d(EgrohCatalogue.TAG, e.toString());
    }

いつもご提案ありがとうございます!

4

1 に答える 1

0

すべてのコードを、startDocument、startElements、endElements、endDocuments などの適切なメソッドと characters メソッドをオーバーライドして記述してはなりません。

この例を参照してください。

于 2012-06-26T08:48:28.700 に答える