私は実際に初めて 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());
}
いつもご提案ありがとうございます!