gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:42:31 26 4
gpt4 key购买 nike

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

IMO 在我的处理程序中调用 intents 或创建 toasts 等有点麻烦,我更愿意从我的 Activity 中做这些事情,这取决于我的处理程序中发生的事情。

大家怎么看?我应该如何以干净的方式执行此操作?

这是一个代码示例:

        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;

}

我不希望从我的处理程序类中显示这些 Toast。

最佳答案

我在我当前的应用程序中做了很多 XML 解析,这是 this example帮助很大。

在设计方面,我相信您应该使用自定义 SAX 处理程序,而不是 toast 或意向广播等,它将在开始的 XML 元素处实例化一个 Parse 对象。该对象代表您的 XML 项。因此,对象可能是汽车,并且有门、颜色、车轮的 setter/getter。当您在 SAX 解析器中解析数据时,您将设置这些值。当 SAX 解析器完成解析时,您调用解析器让它将对象传回您的 Activity ,该 Activity 充满了来自您的 XML 的所有汽车。在我的例子中,我实际上填充了一个传回的对象列表/数组。该示例仅处理一组数据。无论如何,该链接说明了一切。

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

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 对象数组,这些对象被传递回 Activity 。这是一个比使用 toast 或广播更好的解决方案,因为它是一个更解耦的解决方案

编辑 2:我链接的网站第 2 页上的第一篇文章提到了像我这样解析多个 XML 元素。请参阅此处 ( parse multiple xml elements )。

希望对你有帮助

关于Android:将数据从 DefaultHandler 类传递到 Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5708915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com