1

我正在开发一个 android 应用程序,我将在其中大量使用 SAX。我想知道将“数据”或结果从我的处理程序发送回我的活动的最佳方式是什么?

IMO 在我的处理程序中调用意图或创建敬酒等有点混乱,我更愿意从我的活动中做这些事情,这取决于我的处理程序中发生的事情。

你们有什么感想?我应该如何以干净的方式做到这一点?

这是一个代码示例:

        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。

4

3 回答 3

1

我在我当前的应用程序中做了很多 XML 解析,这个例子很有帮助。

设计方面,我相信您应该使用自定义 SAX 处理程序,而不是 toasts 或意图广播等,它将在开始 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 对象数组,这些对象被传递回活动。这是一个比使用 toast 或广播更好的解决方案,因为它是一个更加解耦的解决方案

编辑 2:我链接的网站第二页上的第一篇文章提到了解析多个 XML 元素,比如我的。请参见此处(解析多个 xml 元素)。

我希望这可以帮助你

于 2011-04-18T22:16:14.747 回答
0

你可以:

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

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

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

于 2011-04-18T21:24:37.920 回答
0

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

这里是 Handler 的一个示例用法。

于 2011-04-18T22:14:45.073 回答