总结第一个项目——酷天气

用了三天时间,终于自己亲手开发出一款属于自己的app——酷天气。虽然功能比较单一,而且思路主要借鉴于《第一行代码》。本想着在360商城上线的,没想到因为包名的问题无法上线。这篇博客主要是为了对开发流程就行总结。

大体思路:
功能需求-可行性分析-选择合适的UI-工具准备-整体架构-实体类的准备-详情页的编写-发布并开源

功能需求:
酷天气是一款播报天气的app,所以所需要的功能包括:1.遍历省市县 2.加载省市县的天气情况 3.自动更新。

可行性分析:
加载省市县的天气情况的数据从哪里获得?感谢郭霖大神分析了和风天气的API,网址:http://guolin.tech/api/china,
打开网址,服务器会返回一段JSON格式的数据,其中包含中国所有的省市名称以及省份id,如图所示:
省市的JSON格式
想要查看省内的城市,只需在网址后面加入省份的id即可,查看市内的县与之类似。打开县或区,会发现每一个县或区后面都有一个weather_id,拿着这个id再去访问和风天气的接口就能获取到天气信息。
和风天气接口的使用需要注册,注册完之后用账号登陆就能看到自己的API Key。有了API Key接口和weather_id即可查看城市的天气信息,如查看苏州的天气,只要访问:http://guolin.tech/api/weather?cityid=CN101190401&KEY=XXXXXXXXX。 XXXXXXXXX表示你的Api Key。

工具准备:
1.Android Studio 2.Android手机 3.Git

选择合适的UI:
由于功能比较单一,页面也无需太丰富,本着极简主义的理念,页面没有进行太多的装饰,只是为天气信息增加了背景,背景是用郭霖所提供的分析之后的Bing的接口,地址:http://guolin.tech/api/bing_pic.

项目结构图:
项目结构图
其中asset包用来存放LitePal的布局文件,db包用来存放数据库模型相关的代码,gson包用来存放GSON模型相关的代码,service包用来存放服务相关的代码,util类用来存放工具相关的代码。

添加库依赖:
编辑app/build.gradle文件,修改dependencies闭包,代码如下:
build.gradle
其中添加了4个库,LitePal用于对数据库进行操作,OkHttp用于进行网络请求,GSON用于解析JSON数据,Glide用于加载和展示图片。

设计数据库表结构:
创建省市县三级的实体类,在db包中创建Province、City和County三个实体类,代码如下:
Province.java
City.java
County.java
实体类准备好之后,修改已经穿件的assets目录中的litepal.xml文件为三个实体类添加对应关系,代码如下:
litepal.xml
通过以上代码,便为Province City County三个实体类添加了映射关系。接着配置LitePalApplication文件,修改AndroidManifest.xml文件,代码如下:
AndroidManifest.xml
添加name属性,name属性中的内容是固定的。

增加遍历省市县数据的功能:
由于省市县的数据都是从服务器中获得的,所以在util包中创建一个HttpUtil类,用于和服务器进行交互,代码如下:
HttpUtil.java
通过sendOkHttpRequest()方法,传入请求地址,并注册一个回调来处理服务器响应即可。
由于服务器返回的数据是JSON格式的,所以还需在util创建一个Uitlity类,用来处理和解析JSON格式的数据,代码如下:

在Utility类中,提供了三个方法,handleProvincesResponse() handleCityResponse() handleCountyResponse() 分别对省市县的数据进行处理和解析。

引用碎片:
由于遍历省市县的功能在后面还会用到,所以就不将它写入活动中,而是写入碎片,新建一个choose_area布局文件,修改代码如下:
choose_area.xml

编写遍历省市县数据的碎片:
新建ChooseAreaFragment继承自Fragment,修改代码如下:
ChooseAreaFragment.java
在onCreateView()中获取各种控件,初始化了ArrayAdapter,并将它设置为ListView的适配器。然后在onActivityCreated()方法中为ListView和Button设置了点击事件。初始化工作就完成了。
由于碎片不能在页面上直接显示,需要将它添加在活动中。修改activ_main.xml文件,代码如下:
activity_main.xml
接着修改style.xml文件,代码如下:
styles.xml
最后在AndroidManifest.xml中添加访问网络权限即可。

定义GSON实体类:
由于之前服务器返回JSON类型数据中天气数据的大致格式中包含 status、basic、aqi、now、suggestion、daily_forecast五个部分所以将这五个部分定义为五个实体类。
代码如下:
AQI.java
Suggestion.java
Now.java
Basic.java
Forecast.java

编写天气界面:
创建WeatherActivity活动,设置布局文件名称为activity_weather.xml,创建title.xml作为头布局,创建now.xml用于当前天气信息的布局,forecast.xml作为未来几天天气的布局,forecast_item作为未来天气的子项布局,aqi.xml作为空气质量的布局 ,suggest.xml作为 生活建议的布局。
最终将这些布局文件引入activity_weather.xml中即可。

将天气信息显示到界面上:
在Utile中添加一个解析天气JSON格式数据的方法。然后在活动中请求天气数据,并展示到界面上,修改WeatherActivity代码:
WeatherActivity.java
最后修改ChooseAreaFram中的逻辑,添加页面切换的逻辑即可。

加载Bing每日一图 :
首先修改activity_weather.xml中的代码在,在其中添加ImageView控件用于展示Bing每日一图的图片,接着修改WeatherActivity的代码,为ImageView初始化,并添加加载每日一图的方法。

手动更新和切换城市:
修改activity_weather.xml,加入SwipeRefreshLayout控件,使其用有下拉刷新功能,接着修改WeatherActivity的代码 ,添加下拉刷新的功能。
切换城市:增添一个Butoon按钮,并将背景设置为准备好的图片,然后在WeatherActivity中增加互动菜单的逻辑。

自动更新:
在service包中新建一个AutoUpdateService,代码如下:
AutoUpdateService
其中将自动更新时间设置为1小时更新一次

修改图标和名称:
修改AndroidManifest.xml的代码,将icon属性更改为准备好的图标,然后修改res/values/string.xml 代码如下:
string.xml

开源:
我是将项目发布在Github上,地址:https://github.com/edsonJiao/CoolWeather
希望大家给个Fork!!!

app上线:
注册一个360开发者 ,然后上传即可,在这之前要生成apk文件。