Android:将数据从DefaultHandler类传递给Activity?

时间:2011-04-18 21:08:00

标签: android xml android-intent saxparser

我正在开发一个Android应用程序,我会在很多时候使用SAX。我想知道将“数据”或结果从我的处理程序发送回我的活动的最佳方法是什么?

IMO在我的处理程序中调用意图或创建toast等是很麻烦的,我会优先从我的活动中做那些事情,这取决于我的处理程序中发生的事情。

你们觉得怎么样?我该如何以干净的方式做到这一点?

这是一个代码示例:

        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;

            }

我不想在我的处理程序类中显示这些Toasts。

3 个答案:

答案 0 :(得分:1)

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

设计明智我相信不是敬酒或意图广播等你应该使用自定义SAX处理程序,它将在开头的XML元素中实例化一个Parse对象。此对象表示XML项目。因此,对象可能是Car,并且有一个用于Door,Color,Wheels的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(可以随意调用它)显然你想用其他东西替换siteName和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:我链接的网站第2页上的第一篇文章提到解析像我这样的多个XML元素。见这里(parse multiple xml elements)。

我希望这可以帮助你

答案 1 :(得分:0)

你可以:

  1. 将活动传递给XML 处理程序,将其存储为实例 变量,并回复它 需要的。

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

  3. iOS / Mac OS X有一个名为“通知”的概念,其中任何代码都可以注册某些事件的兴趣。如果有一个Android等价物,那就是另一种方法,我。即XML处理程序可以广播某种失败事件/通知,而Activity可以监听它并弹出toast。

答案 2 :(得分:0)

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

Handler here的示例用法。