2011-04-18 67 views
1

我正在研究一个android应用程序,我将使用SAX相当多。我想知道将我的处理程序的“数据”或结果发送回我的活动的最佳方式是什么?Android:将数据从DefaultHandler类传递给Activity?

IMO在我的处理程序中调用intent或创建敬酒等是一种混乱,我会优先根据我的处理程序中发生的事情从我的活动中完成那些类型的事情。

你们认为什么?我应该如何以一种干净的方式来做到这一点?

下面是一个代码示例:

 public void startElement(String n, String l, String q, Attributes a) throws SAXException{ 
      if(l == "login") in_loginTag = true; 

      if(l == "error") { 

        if(Integer.parseInt(a.getValue("value")) == 1) 
         Toast.makeText(getApplicationContext(), "Couldn't connect to Database", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 2) 
         Toast.makeText(getApplicationContext(), "Error in Database: Table missing", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 3) 
         Toast.makeText(getApplicationContext(), "Invalid username and/or password", Toast.LENGTH_SHORT).show(); 

       error_occured = true; 

      } 

我prefere没有显示从我的处理程序类,这些敬酒。

回答

2

我在当前的应用程序中完成了相当多的XML解析,这对this example有很大的帮助。

设计明智的我相信,而不是敬酒或意图广播等你应该使用自定义的SAX处理程序,它将在开始的XML元素实例化一个Parse对象。这个对象是你的XML项目的表示。所以也许这个物体是Car,并且有门,彩色,轮子的setter/getter。在解析SAX解析器中的数据时,您将设置这些值。当SAX解析器完成解析时,您可以调用解析器使其将对象传递回您的活动,该活动与XML中的所有汽车完全一致。在我的情况下,我实际上填充了传回的对象的列表/数组。该示例仅处理一组数据。无论如何,链接解释了这一切。

编辑:只是看着我的代码,实际上我在处理程序中做的是构建ParsedData集对象的数组,这些对象在通过getParsedData()分析完成后传回给活动。下面是一些重要的代码:

XML处理程序:

private boolean in_IdSite; 
private boolean in_SiteName; 

private ArrayList<ParsedChannelDataSet> list = new ArrayList<ParsedChannelDataSet>(); 

public ArrayList<ParsedChannelDataSet> getParsedData() { 
    return this.list; 
} 

@Override 
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 
    // first tag parsed so add a new ParsedEventDataSet object 
    if(localName.equals("stmSiteUser")) { 
     list.add(new ParsedChannelDataSet()); 
    } else if (localName.equals("idSite")) { 
     this.in_IdSite = true; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = true;  
    } 
} 

@Override 
public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 
    if (localName.equals("idSite")) { 
     this.in_IdSite = false; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = false; 
    } 
} 

@Override 
public void characters(char ch[], int start, int length) { 
    // determine if any tag is current, get data from tag and populate into ParsedEventDataSet 
    if (this.in_IdSite) { 
     this.list.get(this.list.size()-1).setExtractedIdSite(new String(ch, start, length)); 
    } else if (this.in_SiteName) { 
     this.list.get(this.list.size()-1).setExtractedSiteName(new String(ch, start, length)); 
    } 
} 

这里是我的样品ParsedDataSampleSet(这可以称为任何你想要的),很明显,你想要的东西来代替网站名称和idSite别的了。这些只是我的XML元素

public class ParsedChannelDataSet { 
    private String extractedIdSite = null; 
    private String extractedSiteName = null; 


    public String getExtractedIdSite() { 
     return extractedIdSite; 
    } 

    public void setExtractedIdSite(String _extractedIdSite) { 
     this.extractedIdSite = _extractedIdSite; 
    } 

    public String getExtractedSiteName() { 
     return extractedSiteName; 
    } 

    public void setExtractedSiteName(String _extractedSiteName) { 
     Log.d("", _extractedSiteName); 
     this.extractedSiteName = _extractedSiteName; 
    }  


    public String toString() { 
     /* TODO */ 
     return "todo"; 
    } 
} 

所以你可以看到我建立了一个传回给活动的ParsedChannelDataSet对象的数组。这是一个比使用吐司或广播更好的解决方案,因为它有更多的解耦解决方案

编辑2:我在链接的第二页上的第一篇文章提到了解析多个XML元素,比如我的。见这里(parse multiple xml elements)。

我希望这可以帮助你

+0

我以前见过这个例子,但只是简单地看了一下。我可能会采用这种方法。谢谢! – networkprofile 2011-04-18 22:49:18

+0

我刚刚添加了一些示例代码,我意识到我实际上在处理程序中构建了一个我解析对象的数组,我不认为这个例子。 – wired00 2011-04-18 23:13:47

+0

究竟是一个'ParsedChannelDataSet',我在谷歌里找不到它。另外,这里包含了什么? 'list.add(new ParsedChannelDataSet());'或者你只计算你的'stmSiteUser'什么的? – networkprofile 2011-04-18 23:43:38

1

,你可以:

  1. 传递活动进入XML 处理程序,将其存储为一个实例变量 ,并呼吁回到它需要 。

  2. 在您的活动中创建一个静态成员,并在创建时将其分配给 。然后从您的XML处理程序中,您可以引用ActivityClass.getMyActivity()[例如]并调用某种方法来弹出Toast。

iOS/Mac OS X有一个叫做“通知”的概念,任何代码都可以注册某个事件的兴趣。如果有一个Android的等价物,那是另一种方法来做到这一点,我。即XML处理程序可以广播某种失败事件/通知,并且活动可以监听它并弹出Toast。

+0

从我所了解的iOS式的通知使用你如何描述将是Android的广播与意向在活动注册的接收器? – wired00 2011-04-18 21:46:28

+0

看起来像。不幸的是,你需要访问Context才能发送广播事件,我相信这需要一些类似于我的解决方案的工作,以使XML Handler可以使用Context。 – mharper 2011-04-18 22:15:57

0

我会使用我在我的活动中创建的自定义Handler并将它传递给XML解析器。然后在这个解析器中,我可以在自定义Handler上调用一些sendMessage

Handler here的示例用法。

相关问题