Android制作天气预报 —— 查询城市信息

在打开软件时,界面显示的是系统默认城市的天气信息,若想查询其他地区天气则需要按照第二章中描述的操作流程进行修改城市。此处将介绍系统如何获得替换城市的信息。

搜索城市信息调用的是极速数据的获取城市接口,同查询天气情况的设计相似。如图3-7所示,搜索城市功能的实现先在SearchActivity中定义相关控件,设置访问网址,接着实现内部类Getcity。在此处,内部类依然继承AsyncTask,定义了doInBackground()、openConnect()、onPostExecute()三个函数。其中,doInBackground()用于将地址传给openConnect()且保存用户输入的城市Id。

 

图 3- 7获取城市信息的内部类Getcity

openConnect()在接收数据后以HttpURLConnection的get请求方式获取查询城市的相关信息,与前文介绍的获取天气信息的内部类设计相同,此处不重复述说。如图3-8所示。

 

图 3- 8获取城市信息内部类中的openConnect()

onPostExecute()中,如图3-9所示,将openConnect()访问得到的结果(result)以及用户输入的城市Id(input_text)作为参数传给parseCities(),并调用其对访问得到的JSON数据进行解析,找到解析中与输入城市Id相对应的城市信息输出并存入listems中。然后为activity_search_layout中设置的ListView添加SimpleAdapter适配器,用来在ListView中按预计效果显示查询结果。适配器中各参数含义如下:

1、getApplication():适配器关联的View的运行环境是Application,从中获取对象实例;

2、listems:一个Map组成的List,其中的每个条目分别对应界面显示的每一行(即界面中一行对应一个城市信息)。

3、R.layout.activity_search_listview_item:定义列表项的布局文件的资源id。

4、New String [] {“name”}:被添加到Map映射上的键名,指定从listems中的每个Map中读取name对应信息即可。

5、new int [] {R.id.result_text}:将参数4中得到的信息传给activity_search_listview_item中定义的result_text控件处进行显示

由于搜索结果中包含城市名称、所属省份、编号等信息,且每次搜索都会将结果存入listems中,为减少存储空间浪费,在每次搜索城市时都会先将listems清空再录入信息。

 

图 3- 9获取城市信息内部类中的onPostExecute()

上述函数onPostExecute()中调用的函数parseCities()是用于对openConnect()访问得到的JSON结果进行解析提取需要的城市信息。parseCities()代码如图3-10所示。

图 3- 10函数parseCities()

根据极速数据官方给出的获取城市代码示例来看,使用该API查询城市需要逐次返回所有城市信息中一一选择所对应信息,当parentid为0说明城市信息已完整可以输出结果,如图3-10所示。

 

图 3- 11访问顺序

由于Map < String , String>是以键值形式存储数据,可通过键(第一个String)寻找它的值(第二个String),这种方式与调用API的结果获取方式相似,所以设计中采用基于哈希表的Map接口实现方式HashMap将获取的信息cityName与name关联以key-value形式存入map中,再将map存入listems中,得到完整城市信息。下面以用户输入“霍林郭勒市”(县级市)进行搜索为例结合具体代码进行讲解。

如图3-12所示,首先先将用户输入的县名(cityName)逐个与数组元素中有的地方名(city)进行比较,存在相同情况说明存在霍林郭勒市,此时将元素中city对应信息赋给cityName(此时cityName中仅有“霍林郭勒市”)。由于霍林郭勒市所在元素中的parentid不为0,说明相关城市信息还没有查询完毕,进入下一步查询。

 

图 3- 12县级查询

如图3-13所示,确定存在搜索的县级市之后开始查询其所属的市。首先将县所在元素中的parentid逐个与各元素中的cityid进行比较,存在相同情况说明该县是属于该市管辖,例如霍林郭勒市的parentid与通辽的cityid相同,说明霍林郭勒市由通辽市管辖。此时,先用市(通辽)的parentid替代存储在变量中的县(霍林郭勒市)的parentid,接着将获取到的市信息与之前存储的县信息进行结合重新赋值cityName(此时cityName中为“通辽 霍林郭勒市”)。由于市(通辽)的parentid非0,说明城市信息不齐全,进入下一步查询。

图 3- 13市级查询

如图3-14所示,确定县、市之后开始确定省,操作流程与确定市的时候相似,根据市(通辽)的parentid找到与它相同的cityid,从而确定出市(通辽)所属的省或自治区(内蒙古),更新cityName内容(此时cityName中为“内蒙古 通辽 霍林郭勒市”)。在城市查询API中省所在元素中的parentid均为0,所以查询到此步说明得到完整城市信息。

 

图 3- 14省级查询

以上是以用户输入县级城市时为例子讲述系统运行流程,实际情况中三个查询板块不一定都会被调用,系统只会按照“县—市—省”顺序不断查询输入地区的上一级,直至获取完全部上级信息。也就是说只要查询到省级使得parentid为0及会结束当前循环得到完整信息存入listems中。例如用户输入“桂林”时最终得到的cityName结果是“广西 桂林”,输入“天津”时最终结果为“天津”。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值