根据天气预报系统功能需求分析,系统启动后,应在主界面上呈现出中国国内所有城市的列表数据,因此需要创建中国城市列表数据,包括获取、解析城市列表数据,并在用户界面上呈现出来。为此,需要解决的问题是手机终端从Web 服务器获取了所有类型的数据之后,将这些数据进一步交给Android 手机终端View 组件[4],在手机界面上显示给用户。
⑴ 获取城市列表数据
Android 没有提供Web Service 的组件库,但可以通过修改在PC 或J2ME 上使用的开源Web Service Java 库作为AndroidWeb Servic 库使用。kSOAP2(http://ksoap2.sourceforge.net)是一个在智能手机上的SOAP Web Service 客户端包,可用于资源受限制的Java 环境如Applets 或J2ME 应用程序。在GoogleCode 上有一个项目ksoap2-android(http://code.google.com/p/ksoap2-android/)可用在Android 平台上实现轻量级的SOAP 库,即使用ksoap2-android 的API 来调用远端Web Service 的服务。
因此需要在CitiesWeatherForecast.java 的onCreate()中进行数据获取的初始化工作。通过定义一个方法public ListgetAllCitiesNAMEs()可获得中国城市名称列表。也就是说,采用它提供的获得全球各个国家城市的方法GetCitiesByCountry,通过http://www.webservicex.net/globalweather.asmx 上的WebService 可提供天气预报服务。譬如,通过Constant.java 中的public class Constant{},设置SOAP Action 要调用的方法名、命名空间以及Web Service URL值,其源代码为:
public static final String SOAP_ACTION=
"http://www.webserviceX.NET/GetCitiesByCountry";
public static final String METHOD_NAME=
"GetCitiesByCountry";
public static final String SOAP_ACTION2=
"http://www.webserviceX.NET/GetWeather";
public static final String METHOD_NAME2="GetWeather";
public static final String NAMESPACE=
"http://www.webserviceX.NET";
public static final String URL=
http://www.webservicex.net/globalweather.asmx;
然后在WebServiceCaller.java 中实例化一个SoapSerializationEnvelope对象,设置SoapObject 的命名空间、方法名、参数等;并通过实例化一个AndroidHttpTransport 对象来调用WebService,并获得xml 字符串数据,其代码段如下:
AndroidHttpTransport androidHttpTransport=
new AndroidHttpTransport (Constant.URL);
try {
androidHttpTransport.call(soapAction, envelope);
Object result=envelope.getResponse();
xmlStr=result.toString();
} catch(Exception e) {
e.printStackTrace();
}
⑵ 解析数据列表
Android 操作系统对xml 字符串数据的操作功能很强,提供了dom、sax 以及xmlpul 3 种方式。Android SDK 提供了android.sax 包以方便SAX Handler 的开发,可用来解析xml 结果字符串。在本设计实例的CitiesWeatherForecast.java 文件中,解析xml 数据时,先通过RootElement root=new RootElement("NewDataSet")获得xml 数据的根节点;然后再寻找其子节点直到找到City 子节点,并设置一个监听器setEndTextElementListener()来获得City 子节点的值;最后使用org.xml.sax 的SAXParser 来解析xml 数据,把数据存入List并返回:
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader xmlreader=parser.getXMLReader();
xmlreader.setContentHandler(root.getContentHandler());
InputSource is=new InputSource
(new StringBufferInputStream(xmlStr));
xmlreader.parse(is);
⑶ 在UI上呈现城市列表数据
当获得List类型的数据之后,就可以把它绑定到main.xml 定义的ListView 组件上,然后使用ListActivity 呈现列表数据。在CitiesWeatherForecast.java 中的代码段为:
List cityList=getAllCitiesNames();
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, cityList));
即使用方法setListAdapter()把一个ListActivity 填充进去。
2.3 城市天气实况预报系统的调试
城市天气实况预报系统的测试结果如下。在Eclipse 的Package Explorer 窗口中用鼠标右键选择CitiesWeatherForecast工程名,在弹出的窗口中选择"Run As"→"Android Application"安装该应用程序到Android 模拟器并启动它。然后单击所要查询的城市名称列表项,稍等片刻便会显示出该城市的天气实况信息。也可以在文本框中直接输入所要查询的城市名称,单击"Search"同样会获得相应城市的天气预报信息。
3 结束语
本文在介绍基于Android 平台的应用程序设计原理的基础上,提出了Android 用户界面设计、获取并解析城市列表数据的一种方法,给出了在用户界面上呈现数据的原理与设计过程,最后通过模拟器进行了应用程序的调试。当然,基于Android 平台的开发技术还需要进一步完善,需要在日后的工作中不断探索、研究,以建立实用的城市天气实况预报系统。
评论
查看更多