APP下载

基于Android及JSON的天气预报APP设计与实现

2019-03-06史桂红

苏州市职业大学学报 2019年1期
关键词:字符串天气预报线程

史桂红

(苏州健雄职业技术学院 软件与服务外包学院,江苏 太仓 215400)

天气信息和人们的日常生活息息相关,及时精确地获取天气信息对于人们出行和生活尤为重要,天气预报已经成为人们日常生活不可缺少的一部分。同时Android平台极大的开放性和兼容性,深受手机厂商及用户的喜爱,所以有较多基于Android平台的天气预报APP。但目前基于Android平台的天气预报APP多采用XML作为数据交换格式。由于XML文件格式复杂,传输占带宽,同时客户端不同浏览器之间解析XML的方式不一致,需要开发人员重复编写代码,开发复杂且不易维护。本文APP是利用JSON作为数据交换格式,JSON数据格式简单,易于读写,占用带宽小,解析方便,易于维护,实现了浏览器的兼容性和响应的快速性,提高了APP的效率,用户体验感好。

本文APP基于Android Studio开发,通过异步任务访问网络,利用HttpURLConnection方式获取网络中天气数据,利用Gson完成JSON格式的天气信息的解析,利用Android API提供的LocationManager、Geocoder等类实现用户所在位置的定位。

1 关键技术

1) Gson解析技术。Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用GSON可以很容易地将一个Java对象转换为相应的JSON数据,或是将一串JSON数据转换为一个Java对象[1]。用于Java对象和JSON数据之间的相互转化。与JDK自带的JSON解析API相比,使用Gson转换Java对象和JSON数据更加快速、高效,数据传递和解析方便。利用Gson可以很方便地将下面四种常用的数据转换成JSON字符串,并且能够将其解析成原数据对象。4种常用的数据类型有:Java Bean、List、List、List>,通过Gson把这些类型数据转换成JSON字符串的方法都是一样的[2]。Gson核心jar包精简(小于1 M),却提供了非常强大的功能,使用Gson时需先导入Gson jar包。

2) GsonFormat插件。GsonFormat是Android Studio中的一个插件,可以将JSON字符串快速转换成Java实体类。该插件对于复杂(各种嵌套)的JSON字符串格式转换,使用方便,效率高,使用时需先安装该插件。

3) Android线程间通信机制。Android采用单线程模型,其规则是不能在主线程中进行耗时操作,不能在子线程(工作线程)中操作界面控件。在Android系统中,主线程和子线程分别有不同的作用。明确的分工有利于系统分配硬件资源,提高系统性能。其中,主线程主要负责处理与UI相关的事件。子线程主要负责除UI相关事件之外的事件,通常这些事件耗时较长,例如联网下载数据、访问数据库查找数据等[3]。

2 系统总体设计

2.1 功能设计

天气预报APP主要包含三大功能模块:①位置定位模块,根据用户手机所在的位置定位到省市县。②查询模块,可以完成全国任何城市天气的查询,并在天气信息显示模块中将该城市的信息显示出来。③天气信息显示模块,可以显示未来三天的天气信息,包括日期、气温、风向情况等。APP界面效果如图1所示。

2.2 UI布局界面设计

天气预报APP UI界面采用嵌套布局的方式,采用一个垂直方式的线性布局内嵌三个水平方向的线性布局,分别用来放置位置定位、天气信息查询及未来三天天气信息显示。UI界面布局结构如图2所示。

图1 天气预报APP界面

图2 UI界面布局结构图

3 系统实现

3.1 开发环境

天气预报APP采用Android平台,Android是首个为移动终端设备打造的真正开放和完整的移动软件系统,允许开发人员自由获取、修改源代码,Android平台下的应用程序开发主要采用Java语言。本文以Android平台为基础,采用Android Studio集成开发环境完成开发。本文APP设计使用的Android Studio 2.0。

3.2 位置定位

在Android开发中,经常用到定位功能,若应用中需要提供预览地图功能,则使用百度或高德地图等提供的开放API效果较好。若只需要经纬度,或者城市、街道地址等信息,则只需使用LocationManager、Geocoder等Android API提供的类即可。

LocationManager类封装了地理位置信息的接口,利用LocationManager获取到所在地的经纬度信息,利用Geocoder类将经纬度转换为城市、街道等信息。

3.2.1 使用LocationManager获取经纬度

使用LocationManager获取经纬度需先获取LocationManager实例,获取到可用的位置提供器,将获取到的位置提供器传入LocationManager的getLastKnownLocation()方法中即可获取Location信息。如果移动设备地理位置发生变化,则实时更新需要调用LocationManager的requestLocationUpdates()方法,当移动设备所在的位置发生变化后,就会调用监听器LocationListener对象的onLocationChanged()方法完成重新定位。

主要代码如下:

位置提供器是LocationManager获取位置信息的途径,常用的途径有GPS_PROVIDER和NETWORK_PROVIDER。GPS_PROVIDER是通过GPS定位,该定位方式精确,缺点是只能在户外使用,耗电严重,并且返回用户位置信息的速度较慢。NETWORK_PROVIDER是通过WLAN或移动网络(4G/3G)来获取位置信息,室内室外均可用,与GPS定位相比速度更快,耗电更少。

3.2.2 使用Geocoder将经纬度信息转换为城市、街道等信息

Geocoder类是位置解析类。转换时需先获取Geocoder实例,利用其getFromLocation()方法来获取地址列表List

,通过地址列表的getAdminArea()、getLocality()、getSubAdminArea()和getFeatureName()等方法获取省、市、区及街道等信息。本文将经纬度转换为城市、街道等信息的代码封装到了方法updateView()中。updateView()方法代码如下:

3.3 异步任务访问网络

Android单线程模型对线程间通信进行了封装,线程间通信常用的方式有异步任务AsyncTask和Handler+Thread等。本文天气预报APP采用异步任务AsyncTask方式实现。

AsyncTask是一个轻量级的后台异步抽象任务类,适合于后台任务不太多的情况。使用时在主线程中创建AsyncTask的实例并调用其execute()方法,重写其 doInBackground()方法完成访问网络的耗时操作,重写其onPostExecute()方法中完成更新UI控件的操作。

3.4 HTTP协议访问数据

Android网络通信方式有Socket和HTTP协议两种,本文天气预报APP采用HTTP协议方式。通过H T T P协议实现的网络通信又分HttpURLConnection和HttpClient两种,二者均支持Https、流式上传和下载、可配置的超时、IPv6及连接池等。但鉴于HttpClient API太多,很难在不破坏兼容性的情况下对它进行升级和扩展,维护成本高,故Android 开发团队从Androlid 6.0开始删除了HttpClient,官方推荐Android开发用HttpURLConnection方式。HttpURLConnection是一种多用途、轻量级的HTTP客户端,使用它来进行HTTP操作可以适用于大多数应用程序。HttpURLConnection的API比较简单,方便使用者使用和扩展。天气预报APP采用HttpURLConnection方式访问网络数据。

利用HttpURLConnection方式完成HTTP请求的流程如图3所示。

图3 HttpURLConnection方式完成HTTP请求流程图

主要代码如下:

3.5 天气信息的获取及解析

天气信息的获取是向某天气站点发起带有地点参数的URL地址连接以请求数据,站点将返回携带了天气预报信息、地址和日期的JSON格式或XML格式的字符串。JSON是一种轻量级数据格式,其对象是属性、值对的结合,是规范的标签形式,具有很强的可读性[4]。在程序开发中,将获取到的JSON字符串存入缓存区,取出相关属性进行解析。本文天气预报APP获取的天气信息是JSON格式的字符串。

3.5.1 天气信息的获取

天气预报所需数据要从天气预报服务提供商网站上获取,获取这些资源分为收费和免费两种。本文采用和风天气预报的免费接口(https://free-api.heweather.com/v5/)获取天气预报信息。接口的URL为https://free-api.heweather.com/v5/weather?key=8814dcd9a11041a8b34d52b16498880c&city=城市名,其中8814dcd9a11041a8b34d52b16498880c为申请到的key,城市名为利用Geocoder位置解析到的用UTF_8编码表示的城市。通过上述URL 访问天气信息接口,然后用HTTP协议获取网页中的数据,返回的数据是JSON格式的字符串。以下为太仓市天气实况数据:

上述文档中包含了指定城市未来三天的天气预报信息,APP编码中用到的几个标记详细说明如下:(1)daily_forecast标记中包含的是查询城市的日天气预报信息,表示未来三天的天气情况,其中cond包含的是天气状态信息,txt_d白天天气状况,txt_n夜间天气状况;date查询的日期;tmp最高和最低温度;wind风向与风速信息。(2)hourly_forecast标记中包含的是查询城市的时天气预报信息,本文在实现时没有使用,这里不做介绍。

3.5.2 天气信息的解析

XML和JSON是目前流行的两种数据交换格式。XML允许使用自定义格式来标记、交换和处理数据,有助于在服务器之间传输结构化数据,在实际应用中通常会使用DOM API 处理XML 数据,DOM 在不同的浏览器中实现的方式会有一些差异,增加了编程难度,XML中使用了很多起始/结束标记来标记特定数据,提高了数据的可读性,但降低了数据的解析速度与传输效率[5-7]。JSON是一种轻量级的数据交换格式,采用嵌套数据元素的结构,数据格式简单,易于读写,占用带宽小,服务器端和客户端的解析较为方便,从而简化服务器端和客户端的代码开发量,使系统更易于维护[7]。JSON协议几乎支持各种终端语言,如Java、Android、JavaScript[8]。

获取到JSON 格式的天气预报详细数据后,需进行解析从而获取天气相关的各项参数。Android下JSON数据解析常见的方式有:①GSON:使用谷歌开源的JSON解析库;②使用Android.util包下的JsonReader 类;③使用org.json包下的JSONTokener 类及其他几个辅助类;④FastJson:阿里巴巴的开源框架。本天气预报APP采用GSON方式完成,使用GSON工具类解析JSON数据的基本过程:先创建一个空的Java实体类WeatherInfo,利用GSONFormat插件将获取到的JSON字符串转换为JavaBean,再利用GSON的fromJSON()方法将字符串转为对应的实体对象。

主要代码如下:

3.5.3 天气信息的显示

获取解析保存到WeatherInfo实体对象中的信息,将未来三天的天气信息保存到StringBuilder可变的字符序列中。字符序列信息转换为字符串后利用split()方法并借助分隔符" "将信息保存到字符串数组中,最后将字符串数组中的信息赋值到对应的TextView控件中完成显示功能。以温度信息获取为例,代码如下:

4 结论

基于Android及JSON的天气预报APP分别在华为、小米、Oppo、Vivo等主流Android真机网络畅通的情况下进行了测试,达到了预期的运行效果。可以方便地实现用户定位,能够轻松便捷地通过APP获取全国各地城市的天气信息。除了具有定位和显示天气的功能外,该APP还有很多功能可以改进和创新,在后续的开发中将要不断完善,如显示出一周的天气情况,并将天气情况通过折线图等方式形象地展示出来,同时评选最佳天气周方便使用者出行等。

猜你喜欢

字符串天气预报线程
基于C#线程实验探究
基于文本挖掘的语词典研究
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
测不准的天气预报
天气预报的前世今生
如果
SQL server 2008中的常见的字符串处理函数
倍增法之后缀数组解决重复子串的问题
最简单的排序算法(续)