这个项目是基于webservice的,用ksoap2来解析网络上的WebService的,我们先看做出的效果图
其实也没有很多技术难题,我们直接来看源码再做说明吧
Android天气预报源码下载
具体下载目录在 /2012年资料/2月/13日/Android开发教程:Android天气预报/
[java]
import java.util.ArrayList; import java.util.List; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; public class WebServiceUtil { // 定义Web Service的命名空间 static final String SERVICE_NS = "http://WebXml.com.cn/"; // 定义Web Service提供服务的URL static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx"; /** * 获得州,国内外省份和城市信息 * * @return */ public static List<String> getProvinceList() { // 需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息) String methodName = "getRegionProvince"; // 创建HttpTransportSE传输对象 HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL); httpTranstation.debug = true; // 使用SOAP1.1协议创建Envelop对象 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); // 实例化SoapObject对象 SoapObject soapObject = new SoapObject(SERVICE_NS, methodName); envelope.bodyOut = soapObject; // 设置与.Net提供的Web Service保持较好的兼容性 envelope.dotNet = true; try { // 调用Web Service httpTranstation.call(SERVICE_NS + methodName, envelope); if (envelope.getResponse() != null) { // 获取服务器响应返回的SOAP消息 SoapObject result = (SoapObject) envelope.bodyIn; SoapObject detail = (SoapObject) result.getProperty(methodName + "Result"); // 解析服务器响应的SOAP消息。 return parseProvinceOrCity(detail); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 根据省份获取城市列表 * * @param province * @return */ public static List<String> getCityListByProvince(String province) { // 需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数) String methodName = "getSupportCityString"; HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL); httpTranstation.debug = true; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); SoapObject soapObject = new SoapObject(SERVICE_NS, methodName); soapObject.addProperty("theRegionCode", province); envelope.bodyOut = soapObject; envelope.dotNet = true; try { // 调用Web Service httpTranstation.call(SERVICE_NS + methodName, envelope); if (envelope.getResponse() != null) { // 获取服务器响应返回的SOAP消息 SoapObject result = (SoapObject) envelope.bodyIn; SoapObject detail = (SoapObject) result.getProperty(methodName + "Result"); // 解析服务器响应的SOAP消息。 return parseProvinceOrCity(detail); } } catch (Exception e) { e.printStackTrace(); } return null; } private static List<String> parseProvinceOrCity(SoapObject detail) { ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < detail.getPropertyCount(); i++) { String str = detail.getProperty(i).toString(); // 解析出每个省份 result.add(str.split(",")[0]); } return result; } public static SoapObject getWeatherByCity(String cityName) { // 根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数 String methodName = "getWeather"; HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL); httpTranstation.debug = true; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); SoapObject soapObject = new SoapObject(SERVICE_NS, methodName); soapObject.addProperty("theCityCode", cityName); envelope.bodyOut = soapObject; envelope.dotNet = true; try { // 调用Web Service httpTranstation.call(SERVICE_NS + methodName, envelope); if (envelope.getResponse() != null) { // 获取服务器响应返回的SOAP消息 SoapObject result = (SoapObject) envelope.bodyIn; SoapObject detail = (SoapObject) result.getProperty(methodName + "Result"); // 解析服务器响应的SOAP消息。 return detail; } } catch (Exception e) { e.printStackTrace(); } return null; } }