2012-04-09 10 views
0

私のアプリでは、50〜100個のデータが解析されます... 2 MBのサイズの画像もあります...これらはすべて1つのアクティビティに取得され、並べ替えられて表示されますそこに...Android SAX解析の取得が非常に遅い

しかし、それは約2分かかります...それはあまりにも。

解析時間を短縮するにはどうすればよいですか?

または私は間違っているあなたが本当にあなたのコードをプロファイリングし、それはだ場所を見つける必要がありますXmlHandler.java

public class XmlHandler extends DefaultHandler{ 
static GetXml getxml; 
Boolean currentElement = false; 
String currentValue = null; 


@Override 
public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 
// TODO Auto-generated method stub 
currentElement=true; 
    if (localName.equals("root")) 
    { 
     /** Start */ 
     getxml = new GetXml(); 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    // TODO Auto-generated method stub 
    currentElement=false; 

    //**************************display page************************ 

    if (localName.equalsIgnoreCase("DisplayId")) 
     getxml.setDisplayId(currentValue);  

    if (localName.equalsIgnoreCase("DisplayPage")) 
     getxml.setDisplayPage(currentValue); 

    //**************************category details************************ 

     if (localName.equalsIgnoreCase("CategoryId")) 
      getxml.setCategoryId(currentValue);   

     if (localName.equalsIgnoreCase("CategoryName")) 
      getxml.setCategory(currentValue); 

     //**************************news details************************ 

     if (localName.equalsIgnoreCase("Picture")) 
      getxml.setPictureName(currentValue);  

     if (localName.equalsIgnoreCase("newsHeading")) 
      getxml.setNewsHeading(currentValue); 

     if (localName.equalsIgnoreCase("Mainnews")) 
      getxml.setMainNews(currentValue); 




} 
    @Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    // TODO Auto-generated method stub 
    if (currentElement) { 
      currentValue = new String(ch, start, length); 
      currentElement = false; 
     } 
} 
+0

'あなたのクラスをXmlHandler'で、あなたは私たちにそのコードを表示することができますか? –

+0

@DonRobyコードを確認する – subrussn90

答えて

2

答えは、使用しているSAXパーサがXMLコンテンツのスキーマまたはDTDをインターネットでチェックしている可能性があります。これらのチェックをバイパスするentityResolverを記述すると、開始時間(通常は2分程度)が向上する可能性があります。

詳細はこちらをご覧ください。これは、Xercesのを使用して私のために問題を解決し

How to read well formed XML in Java, but skip the schema?

...

3

のための???提案して下さい....

SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 

     /** Send URL to parse XML Tags */ 
     URL sourceUrl = new URL(url); 

     /** Create handler to handle XML Tags (extends DefaultHandler) */ 
     XmlHandler xmlHandler4Profile = new XmlHandler(); 
     xr.setContentHandler(xmlHandler4Profile); 
     xr.parse(new InputSource(sourceUrl.openStream())); 

     } 

コードを解析するSAXを使用していますその時間を過ごす。

掲載されたコードには、パフォーマンスに関する問題と正しさの問題があります。

あなたのendElementコードにelseの使用を追加すると少し増えます。 localNameが何かにマッチすることがわかったら、後でマッチする可能性のないすべての可能性をチェックする必要はありません。

これはあまり効果がないかもしれませんが、確かに試してみる価値があります。

charactersの方法は間違っていますが、これは効率ではなく正確さと関係しています。何が間違っているのか、正確なcharactersメソッドを書く方法については、SAX解析の別の質問については、my answerを参照してください。変更には、バッファに収集する必要があるため、endElementが値を取得する方法も変更する必要があります。

関連する問題