2012-04-09 114 views
0

在我的應用程序中,我有一些要解析的50到100個數據...還有一些2 MB大小以內的圖像...所有這些都將被檢索到單個活動並進行排序和顯示那裏...Android SAX解析檢索速度很慢

但它需要約2分鐘......那太多了。

如何縮短解析時間?

還是我錯了使用SAX解析???建議請....

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

     } 

代碼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'類,你能告訴我們它的代碼? – 2012-04-09 12:16:33

+0

@DonRoby檢查代碼 – subrussn90 2012-04-09 12:22:50

回答

2

答案很可能是您正在使用的SAX解析器正在檢查Internet的XML模式或DTD的內容。如果你寫一個繞過這些檢查的entityResolver,你可能會改善你的開始時間(通常是2分鐘左右)。

請參閱這裏瞭解更多詳情。

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

這解決了使用的Xerces對我來說這個問題......

3

你真的應該分析代碼,並找出它的花時間。

我可以在您的發佈代碼中看到一個性能問題和一個正確性問題。

通過在您的endElement代碼中添加一些else用法,您將獲得一些好處。一旦你知道localName匹配的東西沒有必要檢查它對所有後來的可能性不可能匹配。

這可能沒有太大的收穫,但它的確值得嘗試。

您的characters方法是錯誤的,但這與正確性而不是效率有關。請參閱my answer瞭解有關SAX解析的其他問題以及如何編寫正確的characters方法。此更改還需要更改endElement如何獲取該值,因爲它必須收集到緩衝區中。