14、进入实战——开发酷欧天气

本文档介绍如何开发一个名为酷欧天气的Android应用程序。首先进行功能需求和技术可行性分析,包括显示全国省市区天气信息、切换城市、手动和自动更新天气等功能。接着,讨论如何获取和处理数据,使用和风天气API获取天气预报,利用作者提供的服务器获取省市区数据。介绍了如何在Android Studio中创建项目,使用Git进行版本控制,并将代码托管到GitHub。最后,创建数据库和表,设计数据库表结构,使用LitePal管理数据库,实现了遍历省市县数据的碎片功能。
摘要由CSDN通过智能技术生成

我们将要在本章编写一个功能较为完整的天气预报程序,学习了这么久的Android开发,我们给这个软件起个名字叫酷欧天气,英文名叫作Cool Weather。下面就可以开始动手了。 

14.1 功能需求及技术可行性分析
在编码之前先对程序进行需求分析,想一想酷欧天气中应该具备哪些功能。将这些功能全部整理出来之后,我们才好动手去一一实现。这里我认为酷欧天气中至少应该具备以下功能:

可以罗列出全国所有的省、市、县;

可以查看全国任意城市的天气信息;

可以自由地切换城市,去查看其他城市的天气;

提供手动更新以及后台自动更新天气的功能。

虽然看上去只有4个主要的功能点,但如果想要全部实现这些功能却需要用到UI、网络、数据存储、服务等技术,因此还是非常考验你的综合应用能力的。不过好在这些技术在前面的章节中我们全部都学习过了,只要你学得用心,相信完成这些功能对你来说并不难。

分析完了需求之后,接下来就要进行技术可行性分析了。首先需要考虑的一个问题就是,我们如何才能得到全国省市县的数据信息,以及如何才能获取到每个城市的天气信息。比较遗憾的是,现在网上免费的天气预报接口已经越来越少,很多之前可以使用的接口都慢慢关闭掉了,包括本书第1版中使用的中国天气网的接口。因此,这次我也是特意用心去找了一些更加稳定的天气预报服务,比如彩云天气以及和风天气都非常不错。这两个天气预报服务虽说都是收费的,但它们每天都提供了一定次数的免费天气预报请求。其中彩云天气的数据更加实时和专业,可以将天气预报精确到分钟级,每天提供1000次免费请求;和风天气的数据相对简单一些,比较适合新手学习,每天提供3000次免费请求。那么简单起见,这里我们就使用和风天气来作为天气预报的数据来源,每天3000次的免费请求对于学习而言已经是相当充足了。

解决了天气数据的问题,接下来还需要解决全国省市县数据的问题。同样,现在网上也没有一个稳定的接口可以使用,那么为了方便你的学习,我专门架设了一台服务器用于提供全国所有省市县的数据信息,从而帮你把道路都铺平了。

那么下面我们来看一下这些接口的具体用法。比如要想罗列出中国所有的省份,只需访问如下地址:

http://guolin.tech/api/china

 

服务器会返回我们一段JSON格式的数据,其中包含了中国所有的省份名称以及省份id,如下所示:

[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"天津"}, {"id":4,"name":"重庆"},{"id":5,"name":"香港"},{"id":6,"name":"澳门"}, {"id":7,"name":"台湾"},{"id":8,"name":"黑龙江"},{"id":9,"name":"吉林"}, {"id":10,"name":"辽宁"},{"id":11,"name":"内蒙古"},{"id":12,"name":"河北"}, {"id":13,"name":"河南"},{"id":14,"name":"山西"},{"id":15,"name":"山东"}, {"id":16,"name":"江苏"},{"id":17,"name":"浙江"},{"id":18,"name":"福建"}, {"id":19,"name":"江西"},{"id":20,"name":"安徽"},{"id":21,"name":"湖北"},{"id":22,"name":"湖南"},{"id":23,"name":"广东"},{"id":24,"name":"广西"}, {"id":25,"name":"海南"},{"id":26,"name":"贵州"},{"id":27,"name":"云南"}, {"id":28,"name":"四川"},{"id":29,"name":"西藏"},{"id":30,"name":"陕西"}, {"id":31,"name":"宁夏"},{"id":32,"name":"甘肃"},{"id":33,"name":"青海"}, {"id":34,"name":"新疆"}]


可以看到,这是一个JSON数组,数组中的每一个元素都代表着一个省份。其中,北京的id是1,上海的id是2。那么如何才能知道某个省内有哪些城市呢?其实也很简单,比如江苏的id是16,访问如下地址即可:

http://guolin.tech/api/china/16


也就是说,只需要将省份id添加到url地址的最后面就可以了,现在服务器返回的数据如下:

[{"id":113,"name":"南京"},{"id":114,"name":"无锡"},{"id":115,"name":"镇江"}, {"id":116,"name":"苏州"},{"id":117,"name":"南通"},{"id":118,"name":"扬州"}, {"id":119,"name":"盐城"},{"id":120,"name":"徐州"},{"id":121,"name":"淮安"}, {"id":122,"name":"连云港"},{"id":123,"name":"常州"},{"id":124,"name":"泰州"}, {"id":125,"name":"宿迁"}]


这样我们就得到江苏省内所有城市的信息了,可以看到,现在返回的数据格式和刚才查看省份信息时返回的数据格式是一样的。相信此时你已经可以举一反三了,比如说苏州的id是116,那么想要知道苏州市下又有哪些县和区的时候,只需访问如下地址:

http://guolin.tech/api/china/16/116

这次服务器返回的数据如下:

[{"id":937,"name":"苏州","weather_id":"CN101190401"},
{"id":938,"name":"常熟","weather_id":"CN101190402"},
{"id":939,"name":"张家港","weather_id":"CN101190403"},
{"id":940,"name":"昆山","weather_id":"CN101190404"},
{"id":941,"name":"吴中","weather_id":"CN101190405"},
{"id":942,"name":"吴江","weather_id":"CN101190407"},
{"id":943,"name":"太仓","weather_id":"CN101190408"}]


通过这种方式,我们就能把全国所有的省、市、县都罗列出来了。那么解决了省市县数据的获取,我们又怎样才能查看到具体的天气信息呢?这就必须要用到每个地区对应的天气id了。观察上面返回的数据,你会发现每个县或区都会有一个weather_id,拿着这个id再去访问和风天气的接口,就能够获取到该地区具体的天气信息了。

下面我们来看一下和风天气的接口该如何使用。首先你需要注册一个自己的账号,注册地址是http://guolin.tech/api/weather/register 。注册好了之后使用这个账号登录,就能看到自己的API Key,以及每天剩余的访问次数了,如图14.1所示。

图 14.1 API Key和每天剩余访问次数

有了API Key,再配合刚才的weather_id,我们就能获取到任意城市的天气信息了。比如说苏州的weather_id是CN101190401,那么访问如下接口即可查看苏州的天气信息:

http://guolin.tech/api/weather?cityid=CN101190401&key=bc0418b57b2d4918819d3974ac1285d9


其中,cityid部分填入的就是待查看城市的weather_id,key部分填入的就是我们申请到的API Key。这样,服务器就会把苏州详细的天气信息以JSON格式返回给我们了。不过,由于返回的数据过于复杂,这里我做了一下精简处理,如下所示:

{
    "HeWeather": [
    {
            "status": "ok",
            "basic": {},
            "aqi": {},
            "now": {},
            "suggestion": {},
            "daily_forecast": []
        }
    ]
}


返回数据的格式大体上就是这个样子了,其中status 代表请求的状态,ok 表示成功。basic 中会包含城市的一些基本信息,aqi 中会包含当前空气质量的情况,now 中会包含当前的天气信息,suggestion 中会包含一些天气相关的生活建议,daily_forecast 中会包含未来几天的天气信息。访问http://guolin.tech/api/weather/doc 这个网址可以查看更加详细的文档说明。

数据都能获取到了之后,接下来就是JSON解析的工作了,这对于你来说应该很轻松了吧?

确定了技术完全可行之后,接下来就可以开始编码了。不过别着急,我们准备让酷欧天气成为一个开源软件,并使用GitHub来进行代码托管,因此先让我们进入到本书最后一次的Git时间。

 

14.2 Git时间——将代码托管到GitHub上

经过前面几章的学习,相信你已经可以非常熟练地使用Git了。本节依然是Git时间,这次我们将会把酷欧天气的代码托管到GitHub上面。

 

GitHub是全球最大的代码托管网站,主要是借助Git来进行版本控制的。任何开源软件都可以免费地将代码提交到GitHub上,以零成本的代价进行代码托管。GitHub的官网地址是https://github.com/ 。官网的首页如图14.2所示。

 

 

 

图 14.2 GitHub首页

 

首先你需要有一个GitHub账号才能使用GitHub的代码托管功能,点击Sign up for GitHub按钮进行注册,然后填入用户名、邮箱和密码,如图14.3所示。

 

 

 

图 14.3 注册账号

 

点击Create an account按钮来创建账户,接下来会让你选择个人计划,收费计划有创建私人版本库的权限,而我们的酷欧天气是开源软件,所以这里选择免费计划就可以了,如图14.4所示。

 

 

 

图 14.4 选择免费计划

 

接着点击Continue按钮会进入一个问卷调查界面,如图14.5所示。

 

 

 

图 14.5 问卷调查界面

 

如果你对这个有兴趣就填写一下,没兴趣的话直接点击最下方的skip this step跳过就可以了。

 

这样我们就把账号注册好了,会自动跳转到GitHub的个人主页,如图14.6所示。

 

 

 

图 14.6 GitHub个人主页

 

接下来就可以点击Start a project按钮来创建一个版本库了。由于我们是刚刚注册的账号,在创建版本库之前还需要做一下邮箱验证,验证成功之后就能开始创建了。这里将版本库命名为coolweather,然后选择添加一个Android项目类型的.gitignore文件,并使用Apache License 2.0来作为酷欧天气的开源协议,如图14.7所示。

 

 

 

图 14.7 创建版本库

 

接着点击Create repository按钮,coolweather这个版本库就创建完成了,如图14.8所示。版本库主页地址是https://github.com/guolindev/coolweather 。

 

 

 

图 14.8 版本库主页

 

可以看到,GitHub已经自动帮我们创建了.gitignore、LICENSE和README.md这3个文件,其中编辑README.md文件中的内容可以修改酷欧天气版本库主页的描述。

 

创建好了版本库之后,我们就需要创建酷欧天气这个项目了。
在Android Studio中新建一个Android项目,项目名叫作CoolWeather,包名叫作com.coolweather.android,如图14.9所示。
 

图 14.9 创建CoolWeather项目

 

之后的步骤不用多说,一直点击Next就可以完成项目的创建,所有选项都使用默认的就好。

 

接下来的一步非常重要,我们需要将远程版本库克隆到本地。

首先必须知道远程版本库的Git地址,点击Clone or download按钮就能够看到了,如图14.10所示。 
 

 

图 14.10 查看版本库的Git地址

 

点击右边的复制按钮可以将版本库的Git地址复制到剪贴板,酷欧天气版本库的Git地址是https://github.com/zjgwhcn/coolweather.git
非:https://github.com/guolindev/coolweather.git 。

 

然后打开Git Bash并切换到CoolWeather的工程目录下,如图14.11所示。

 

 

 

图 14.11 在Git Bash中进入CoolWeather工程目录

 

接着输入git clone https://github.com/zjgwhcn/coolweather.git 来把远程版本库克隆到本地,如图14.12所示。

 

 

 

图 14.12 将远程版本库克隆到本地

 

看到图中所给的文字提示就表示克隆成功了,并且.gitignore、LICENSE和README.md这3个文件也已经被复制到了本地,可以进入到coolweather目录,并使用ls -al 命令查看一下,如图14.13所示。

 

 

 

图 14.13 查看克隆到本地的文件

 

现在我们需要将这个目录中的所有文件全部复制粘贴到上一层目录中,这样就能将整个CoolWeather工程目录添加到版本控制中去了。注意.git是一个隐藏目录,在复制的时候千万不要漏掉。另外,上一层目录中也有一个.gitignore文件,我们直接将其覆盖即可。复制完之后可以把coolweather目录删除掉,最终CoolWeather工程的目录结构如图14.14所示。

 

 

 

图 14.14 CoolWeather工程的目录结构

 

接下来我们应该把CoolWeather项目中现有的文件提交到GitHub上面,这就很简单了,先将所有文件添加到版本控制中,如下所示:

 

git add .

 

 

然后在本地执行提交操作:

git commit -m "First commit."


 

最后将提交的内容同步到远程版本库,也就是GitHub上面:

git push origin master

 

 

注意,在最后一步的时候GitHub要求输入用户名和密码来进行身份校验,这里输入我们注册时填入的用户名和密码就可以了,如图14.15所示。

 

图 14.15 将提交的内容同步到远程版本库

 

这样就已经同步完成了,现在刷新一下酷欧天气版本库的主页,你会看到刚才提交的那些文件已经存在了,如图14.16所示。

图 14.16 在GitHub上查看提交的内容
 

14.3 创建数据库和表

从本节开始,我们就要真正地动手编码了,为了要让项目能够有更好的结构,这里需要在com.coolweather.android包下再新建几个包,如图14.17所示。

 

 

图 14.17 项目的新结构

 

其中db包用于存放数据库模型相关的代码,gson包用于存放GSON模型相关的代码,service包用于存放服务相关的代码,util包用于存放工具相关的代码。

 

根据14.1节进行的技术可行性分析,第一阶段我们要做的就是创建好数据库和表,这样从服务器获取到的数据才能够存储到本地。关于数据库和表的创建方式,我们早在第6章中就已经学过了。那么为了简化数据库的操作,这里我准备使用
LitePal  来管理酷欧天气的数据库。(需要再学习)

 

首先需要将项目所需的各种依赖库进行声明,编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

 

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:24.2.1'
testImplementation 'junit:junit:4.12'
implementation 'org.litepal.android:core:1.4.1'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.google.code.gson:gson:2.7'
implementation 'com.github.bumptech.glide:glide:3.7.0'

}

 

 

 

这里声明的4个库我们之前都是使用过的,LitePal用于对数据库进行操作,OkHttp用于进行网络请求,GSON用于解析JSON数据,Glide用于加载和展示图片。酷欧天气将会对这几个库进行综合运用,这里直接一次性将它们都添加进来。

 

然后我们来设计一下数据库的表结构,表的设计当然是仁者见仁智者见智,并不是说哪种设计就是最规范最完美的。这里我准备建立3张表:province、city、county,分别用于存放省、市、县的数据信息。对应到实体类中的话,就应该建立Province 、City 、County 这3个类。

 

那么,在db包下新建一个Province 类,代码如下所示:

 

public class Province extends DataSupport {

 

    private

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值