首页 文章

Android中的SAX Parser存在内存问题

提问于
浏览
1

我实际上是第一次使用SAX Parser . 从这里的教程和问题我可以找到大部分的东西,现在几乎一切都工作正常 . 但我还有一个问题 . 解析logcat时会显示很多垃圾收集器日志 . 有时也会出现堆消息增长 . 如果发生这种情况,总会创建错误的项目 . 也许有人在这里有一些优化建议 .

这是处理程序的字符方法的代码,解析器总是解析完整的文件,之后所有找到的项都存储在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());
    }

非常感谢您的每一个建议!

1 回答

  • 0

    您不能通过覆盖正确的方法来编写所有代码,例如startDocument,startElements,endElements,endDocuments以及字符方法 .

    请参阅this示例 .

相关问题