介绍
在 Android 中与服务端做 HTTP 通信,解析 XML,通过 Handler 实现异步消息处理
HTTP 通信 - 与服务端做 HTTP 通信,分别以 GET 方式和 POST 方式做演示
XML 解析 - 可以用两种方式解析 XML,分别是 DOM 方式和 SAX 方式
异步消息处理 - 通过 Handler 实现异步消息处理,以一个自定义的异步下载类来说明 Handler 的用法
1、HTTP 通信和 XML 解析的 Demo
MySAXHandler.java
package com.webabcd.communication;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
// 继承 DefaultHandler 以实现指定 XML 的 SAX 解析器
// DOM - W3C 标准,需要把 xml 数据全部加载完成后才能对其做解析,可对树做任意遍历
// SAX - 流式解析,通过事件模型解析 xml,只能顺序解析
public class MySAXHandler extends DefaultHandler {
private boolean mIsTitleTag=false;
private boolean mIsSalaryTag=false;
private boolean mIsBirthTag=false;
private String mResult="";
// 打开 xml 文档的回调函数
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
// 关闭 xml 文档的回调函数
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
// 一发现元素开始标记就回调此函数
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName == "title")
mIsTitleTag=true;
else if (localName == "salary")
mIsSalaryTag=true;
else if (localName == "dateOfBirth")
mIsBirthTag=true;
else if (localName == "employee")
mResult += "\nname:" + attributes.getValue("name");
}
// 一发现元素结束标记就回调此函数
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName == "title")
mIsTitleTag=false;
else if (localName == "salary")
mIsSalaryTag=false;
else if (localName == "dateOfBirth")
mIsBirthTag=false;
}
// 一发现元素值或属性值就回调此函数
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (mIsTitleTag)
mResult += new String(ch, start, length);
else if (mIsSalaryTag)
mResult += " salary:" + new String(ch, start, length);
else if (mIsBirthTag)
mResult += " dateOfBirth:" + new String(ch, start, length);
}
public String getResult(){
return mResult;
}
}