天气客户端开发报告
1 系统需求分析
1.1功能性需求分析
天气预报客户端,最基本就是为用户提供准确的天气预报信息。天气查询结果有两种:一种是当天天气信息,信息结果比较详细,除温度、天气状况外还可以提示穿衣建议、湿度、风向等信息,这样使天气信息更加完善;一种是未来几天天气预报信息,提供未来几天的天气状况,方便用户的出行预判。
1.2性能需求分析
为了保证客户端能够长期、安全、稳定、可靠、高效的运行,天气客户端应该满足以下的性能需求:
1)系统处理的准确性和及时性
2)系统的开放性和系统的可扩充性
3)系统的易用性和易维护性
4)系统的资源低消耗性
2 系统设计
2.1界面架构
结合用户查询习惯,在主界面我们可以提供两种查询方法:
1.输入查询:
在城市输入栏中输入所需查询城市的名字,点击查询按钮即可显示出天气信息。
2.选择查询:
针对常见大中型城市,如北京、上海等,为方便用户查询,只要在预设城市的下拉栏中寻找用户所查找城市,点击查询按钮即可显示出天气信息。
用Axure RP 画出的界面设计图如下:
2.2系统模块
整个系统由四个模块组成
系统模块 | 模块功能 |
ConstData | 存放预设城市 |
Weather | 设置当天和未来几天天气类 |
chacun | 解析并获得天气信息 |
MainActivity | 天气查询主界面 |
3 系统实现
3.1 UI界面实现
3.1.1主界面实现
Android用户布局都是在布局在XML文件中,这些XML文件放在工程/res/layout下。在安卓系统中,开发人员把用户界面放在在XML文档中定义,可以使XML文档专门负责用户UI界面设计,而java程序负责功能实现,从而降低程序耦合,便于程序的维护与扩展。
多数的界面控件都在android.view和android.widget包中,android.view.View为他们的父类。
在activity.main主界面XML文件中,定义了TextView、Button、ExitText、这三种基本控件,它们分别表示文字显示、按钮切换、文本输入TextView用来显示软件性质,Button用来控制“查询”键,ExitText用来输入所查询城市名字。
主界面XML文件还定义了ListView、Spinner这两个需要适配器的布局文件和LinearLayout、RelativeLayout布局文件。ListView、Spinner分别用来显示天气查询结果列表、下拉栏里的城市,LinearLayout、RelativeLayout分别表示线性布局和相对布局,控制整个主界面的布局。
3.1.2天气内容界面实现
在list_item.XML文件中通过LinearLayout布局文件的设置将天气结果以下表的格式显示出来
date | week |
weather | tempt |
wind | |
dressing_advice |
3.2 设置天气类Weather
设置一个天气类Weather,以便查询和显示天气。
3.2.1定义私有变量
使用private定义私用成员city、date、week、weather、temperature、wind、dressing_advice,使用户不能私自提取天气数据,只能按照自己构造的方法提取出来。
3.2.2构造函数
通过重载构造函数Weather创建有参和无参两种对象方式,增强系统使用弹性。既能运用反射机制生成对象,用能为继承使调用Weather类构造函数方便。
3.2.3提供取值方法
运用反射机制getClass和setClass的方法,提供获得天气具体数据的方法。
3.3天气查询功能实现
3.3.1解析天气信息
天气预报系统最重要的就是获取天气信息,为获得实时天气信息,我们就要访问专门天气信息的网站把返回的信息解析出来。系统采HttpURLConnection的访问方式来和Web 客户机取得联系,并以字节数组的方式返回。其中urlPath由三部分组成:
信息源网址 | cityname | key |
其中信息源网址由haoservice服务平台提供提供,cityname为所查询城市的名字,key表示用户标识。
我通过http://apis.haoservice.com/weather这个网站提供的参数来获取指定城市的天气信息。它主要使用JSON(JavaScript Object Notation)数据交换格式,可以在在异步应用程序中将字符串从 Web 客户机传递给服务器端,有对象object和数组array这两种数据结构。对象是一个无序的“‘名称/值’对”集合,数组是值(value)的有序集合。
3.3.2获得天气信息
将解析后的JSON格式天气数据分别赋值给定义的todayWeather类和we类,它们是实例化的天气类Weather,分别表示当天天气信息和未来天气信息,最后添加到数组列表weathers中。这样就能获得天气信息。
3.4主程序实现
3.4.1设置Activity界面
通过setContentView(R.layout.activity_main)将主程序MainActivity采用activity_main布局。利用findViewById函数将主程序按钮与布局文件一一对应,其中下拉栏Spinner与显示列表Listview绑定对应的适配器。对应列表如下:
主程序MainActivity | activity_main界面 |
currentCityTv | currentCity |
city_Et | cityEt |
city_spr | citySpinner |
mListView | mListView |
3.4.2显示天气
为天气结果显示列表ListView绑定一个适配器myAdapter,通过myAdapter.notifyDataSetChanged通知MainActivity更新显示ListView。配器myAdapter类图如下:
适配器myAdapter继承 BaseAdapter类,ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到 listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。getItem返回该对象本身,getItemid返回该对象的索引。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局,即list_item.XML文件中的布局。
在getView函数中使用ViewHolder的作用是用来优化显示效率,即之前显示过的不用再从布局文件读取,直接从缓存中读取。它只是一个静态类,它的作用就在于减少不必要的调用findViewById,把对底下的控件引用存在ViewHolder里面,再用convertView.setTag(holder)把它放在view里,下次就可以用(ViewHolder) convertView.getTag()直接取了。
3.4.3利用Handler来实现天气信息更新
Handler与调用者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞,这种操作线程是不安全的。因此本程序采取调用线程Thread(Runnable),在线程中处理操作。Thread线程发出Handler消息,通知更新,Handler根据接收的消息,处理更新。
Thread线程在查询完天气后发出msg信息,Handler根据接收的消息显示查询结果。
4系统测试
4.1测试目的
1.确定软件质量,确保软件正确运行。
2.确定信息正确性,确保天气情况与实际相符。
4.2测试内容
1.在文本栏中输入城市
2.在下拉栏中选择城市
3.在输入栏中输入不存在的城市
4.不输入城市查询
5总结
本次实验主要完成了一款基于android平台的天气预报软件的设计与实现。提出了android用户界面设计、获取并解析城市列表数据的办法,给出了在用户界面上的原理与实现过程,最后通过模拟器进行了应用程序的调试。
本程序能实现当日及未来一个星期的天气预报,有良好的稳定性及扩展性,但是有待完善的地方依然很多,未来改进时可以考虑一下几点:加入国际城市;根据不同天气状态动态变化背景图片;可以添加常用城市;将软件做成桌面小窗口方便查询。这些功能都需要在日后学习中不断探索研究,以建立实用的天气预报系统。
感谢娄老师和同学们给予我的帮助!