我正在开发一个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。
答案 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)
你可以:
将活动传递给XML 处理程序,将其存储为实例 变量,并回复它 需要的。
在您的活动中创建一个静态成员并将活动分配给 当它被创建时。然后从您的XML处理程序中,您可以引用ActivityClass.getMyActivity()[例如]并调用一些方法来弹出toast。
iOS / Mac OS X有一个名为“通知”的概念,其中任何代码都可以注册某些事件的兴趣。如果有一个Android等价物,那就是另一种方法,我。即XML处理程序可以广播某种失败事件/通知,而Activity可以监听它并弹出toast。
答案 2 :(得分:0)
我会使用我在活动中创建的自定义Handler
并将其传递给XML解析器。然后在这个解析器中,我可以在自定义处理程序上调用一些sendMessage
。
Handler here的示例用法。