2012-04-09 14 views
0

In meiner App habe ich einige 50 bis 100 Daten analysiert werden ... auch einige Bilder innerhalb von 2 MB Größe ... Alle diese zu einer einzigen Aktivität abgerufen werden und sortiert und angezeigt werden da ...Android SAX Parsing Retrieval sehr langsam

Aber es dauert etwa 2 Minuten ... das ist zu viel.

Was ist zu tun, um die Analysezeit zu reduzieren?

Oder bin ich falsch SAX mit Parsen ??? Vorschläge bitte ....

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

     } 

-Code für 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

Ist 'Klasse XmlHandler', und können Sie uns zeigen, seinen Code? –

+0

@DonRoby überprüfen Sie den Code – subrussn90

Antwort

2

Die Antwort ist wahrscheinlich, dass der SAX-Parser, den Sie verwenden, das Internet nach dem Schema oder der DTD Ihres XML-Inhalts überprüft. Wenn Sie einen entityResolver schreiben, der diese Prüfungen umgeht, werden Sie wahrscheinlich Ihre Startzeit verbessern (was oft 2 Minuten dauert).

Sehen Sie dies für weitere Details.

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

Dies löste das Problem für mich Xerces mit ...

3

Sie sollten wirklich Ihren Code Profil und finden Sie heraus, wo es seine Zeit verbringen.

Ich kann ein Leistungsproblem und ein Korrektheitsproblem in Ihrem geposteten Code sehen.

Sie erhalten ein bisschen durch Hinzufügen von else Verwendung in Ihrem endElement Code. Sobald Sie wissen, localName entspricht etwas, es gibt keine Notwendigkeit, es gegen alle späteren Möglichkeiten zu überprüfen, die möglicherweise nicht übereinstimmen können.

Das kann nicht viel gewinnen, aber es ist sicherlich einen Versuch wert.

Ihre characters Methode ist falsch, aber das hat eher mit der Korrektheit als mit der Effizienz zu tun. Siehe my answer zu einer anderen Frage über SAX-Parsing für was falsch ist und wie man eine korrekte characters Methode schreibt. Die Änderung erfordert auch eine Änderung, wie endElement den Wert erhält, da es in einem Puffer gesammelt werden muss.