安卓天气预报课程设计 下载本文

Android系统课程设计

以方便后面使用。代码如下所示。定义数据库名,版本。将构造方法私有化,实例化数据库。保存加载省级、市级、县级数据信息

从提交的程序中可以看到CoolWeatherDB是一个单例类,这里将它的构造方法私有化,并提供了一个getInstance()方法来获取CoolWeatherDB的实例,这样就可以保证全局范围内只会有一个CoolWeatherDB的实例。在CoolWeatherDB中,提供了六组方法,saveProvince()、loadProvince()、saveCity()、loadCities()、saveCounty()、loadCounties(),分别用于存储省份数据、读取所有省份数据,存储城市数据、读取某省内所有城市数据,存储县数据、读取某市内所有县的数据。

3.2.2.2 第二阶段

1.全国所有的省市县的数据都是从服务器端获取到的,所以为了使程序具有遍历全国省市县的功能,这里和服务器的交互式必不可少的。所以先在util包下增加一个HttpUtil类。因为在HttpUtil中使用到了HttpCallbackListener接口来回调服务返回的结果,因此还需要在util包下添加这个接口。另外由于服务器返回的省市县数据都是“代号|城市,代号|城市,??”这种格式的,所以要再提供一个工具类来解析和处理这种数据,。在util包下再新建一个Utility类。在该类中,提供了handlepRrovince()、handleCitiesResponse()、handleCountiesResponse()这三个方法,分别用于解析和处理服务器返回的省级、市级、县级数据。解析的规则就是先按逗号分隔,再按单竖线分隔,接着将解析出来的数据设置到实体类中,最后调用CoolWeatherDB中的三个save()方法将数据存储到相应的表中。两个类和一个接口的创建如图3.5所示。

图3.5 解析数据工具类

2.工具类准备好,开始布局,在res/layout目录下新建choose_area.xml布局。布局文件中的内容比较简单,先是定义一个50dp高的头布局,并在里面放置了一个TextView用于显示标题内容。然后在头布局的下面定义了一个ListView,用于显示省市县的数据。

3.编写用于遍历省市县的活动,在activity包下新建ChooseAreaActivity继承自Activity。

该类中的代码非常多,这里只把逻辑理理。在onCreate()方法中先是获取到了一些控件的实例,然后去初始化了ArrayAdapter,将它设置为ListView的适配器。之后又去获取到了CoolWeatherDB的实例,并给ListView设置了点击事件,到这,初始

9

Android系统课程设计

化工作完成。

在onCreate()方法的最后调用了queryProvince()方法,也就是从这里开始加载省级数据的。queryProvinces()方法的内部会首先调用CoolWeatherDB和loadProvinces()方法来从数据库读取省级数据。如果读取到了就直接将数据显示到界面上,如果没有读取到就调用queryFromServer()方法从服务器上查询数据。

queryFromServer()方法会先根据传入的参数来拼装查询地址,现在网上有不少免费的天气预报接口可以实现上述功能,例如新浪天气,百度天气的,这里我准备使用中国天气网提供的API,接口来实现上述功能。

比如要想,努力出中国所有的省份,只需访问如下地址,这里需要注意,如果用浏览器直接访问的话,可能会得到一个错误提示。这是因为浏览器认为服务器应该返回一个xml格式的数据。但实际上服务器返回的数据,并不是xml格式所导致的,右键查看网页源码代码就可以看到服务器返回的真是数据了:

http://www.weather.com.cn/data/list3/city.xml

服务器会返回一段文本信息,其中包含了中国所有的省份名称以及省级代号,如下

01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,12|山东,13|新疆,14|西藏,15|青海,16|甘肃,17|宁夏,18|河南,19|江苏,20|湖北,21|浙江,22|安徽,23|福建,24|江西,25|湖南,26|贵州,27|四川,28|广东,29|云南,30|广西,31|海南,32|香港,33|澳门,34|台湾

可以看到北京的代号是01,上海的代号是02,不同省份之间以逗号隔开,省份名称和省级代号之间用单竖线分隔。要想知道某个省内有哪些城市,比如江苏的代号是19,那么只要访问如下地址:

http://www.weather.com.cn/data/list3/city19.xml 这次服务器返回的数据如下:

190401|苏州,190402|常熟,190403|张家港,190404|昆山,190405|吴县东山,190406|吴县,190407|吴江,190408|太仓

通过这种方式,就能把全国所有的省,市,县,都罗列出来了。那么解决了全国省市县数据的获取,然后就是解决查询天气信息的问题。这里原理同上,比如,昆山的县级代号是190404,那么访问如下地址:

http://www.weather.com.cn/data/list3/city190404.xml 这时服务器返回的数据非常简短: 190404|101190404

其中后半部分的101190404就是昆山所对应的天气代号了。这个时候再去访问

10

Android系统课程设计

查询天气接口,将相应的天气代号填入即可,接口地址如下:

http://www.weather.com.cn/data/cityinfo/101190404.html

这样服务器就会把昆山当前的天气信息以JSON格式返回给我们了,如下所示: {“weatherinfo”:

“city”:昆山,”cityid”:101190404,”temp1”:”21℃”,”temp2”:”9℃”,”weather”:”多云转小雨”,”img1”:”d1.gif”,”img2”:”n7.gif”,”ptime”:”11:00”}

其中city表示城市名,cityid表示城市对应的天气代号,temp1和temp2表示气温是几度到几度,weather表示今日天气信息的描述,img1和img2表示今日天气对应的图片,ptime表示天气发布的时间。

确定了查询地址之后,接下来就调用HttpUtil的sendHttpRequest()方法来向服务器发送请求,响应的数据会回调到onFinish()方法中,然后去调用Utility的handleProvincesResponse()方法牵扯到了UI操作,因此必须要在主线程中调用,这里借助了runOnUiThread()方法来实现从子线程切换到主线程,它的实现原理其实也是基于异步消息处理机制的。现在数据库中已经存在了数据,因此调用queryProvinces()就会直接将数据显示到界面上。

当你点击了某个省的时候进入到ListView的onClick()方法中,这个时候会根据当前的级别来判断是去调用queryCities()方法还是queryCounties()方法,queryCities()方法是去查询市级数据,而queryCounties()方法是去查询县级数据,这两个方法内部的流程和queryProvinces()方法基本相同,不重复说明了。

这里重写onBackPressed()方法来覆盖默认Back键的行为,会根据当前的级别来判断是返回市级列表、省级列表、还是直接退出。

配置androidMainifest.xml文件。为活动添加访问网络权限

11

Android系统课程设计

图3.6 省份菜单

可以看到,全国所有的省级单位都出来了,继续查看市级单位,比如点击黑龙江如图3.7所示。

12