【问题标题】:Android SAX parsing retrieval very slowAndroid SAX解析检索很慢
【发布时间】:2012-04-09 12:13:16
【问题描述】:

在我的应用程序中,我有大约 50 到 100 个数据要解析...还有一些 2 MB 大小的图像...所有这些都将被检索到单个活动并在那里进行排序和显示...

但它需要大约 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;
        }
}

【问题讨论】:

  • XmlHandler 是你的班级吗,你能告诉我们它的代码吗?

标签: android android-emulator sax android-parser


【解决方案1】:

答案很可能是您使用的 SAX 解析器正在互联网上检查您的 xml 内容的架构或 DTD。如果您编写一个绕过这些检查的 entityResolver,您可能会缩短开始时间(通常是 2 分钟左右)。

有关详细信息,请参阅此内容。

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

这解决了我使用 Xerces 的问题...

【讨论】:

    【解决方案2】:

    您确实应该分析您的代码并找出它花费时间的地方。

    我可以在您发布的代码中看到一个性能问题和一个正确性问题。

    通过在endElement 代码中添加一些else 用法,您会有所收获。一旦你知道localName 匹配了某个东西,就没有必要检查它与以后不可能匹配的所有可能性。

    这可能收益不大,但肯定值得一试。

    您的characters 方法是错误的,但这与正确性有关,而不是与效率有关。请参阅my answer 了解有关 SAX 解析的另一个问题,了解问题所在以及如何编写正确的characters 方法。该更改还需要更改 endElement 获取值的方式,因为它必须被收集到缓冲区中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 2011-12-07
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2011-04-16
      • 2013-12-05
      相关资源
      最近更新 更多