参考文献:第一行代码(第二版),郭霖
源码地址:https://github.com/2066972218/coolweather/commits/master
一、功能需求
1、罗列全国的省、市、县
2、查看全国任意城市的天气情况
3、自由切换城市,查看异地城市的天气情况
4、手动更新与后台自动更新天气的功能
二、可行性分析:
1、需要用到的技术有:UI、网络、数据存储、服务
2、天气信息来源:和风天气,有3000+次/天免费数据获取
3、架设服务器用于提供全国的省市县的数据信息
三、全国地区信息获取
1、访问 http://guolin.tech/api/china 得到以下全国地区数据,其包括了中国所有的省份以及省份的id:
这是一个JSON格式的数组,在网址后加相应城市的id可以得到该省份城市下的所有市级城市,如:
http://guolin.tech/api/china/30
在网址后继续键入id,可以得到该市级下的县级城市:
如:http://guolin.tech/api/china/30/304
可以看到每一个县级城市都有一个weather_id,我们可以通过这个id去访问和风天气的接口,从而过去该地区的的天气情况。
2、使用和风天气的接口
注册账号:http://guolin.tech/api/weather/register
选择免费用户,注册成功后,去邮箱激活,之后登陆该账号,https://console.heweather.com/ 查看API接口说明文档。
3、Git时间
https://github.com/ 为GitHub官网,注册登陆,点击start a project~输入Coolweather~选择Android项目类型的gitignore文件和Apach License2.0作为天气的开源协议
创建成功后出现以下界面,其中README.md为版本库主页说明,点击Clone or download按钮,将该复制到剪贴板:
版本库主页为:https://github.com/2066972218/coolweather
在Android Studio中新建一个项目CoolWeather,然后将远程代码库克隆值本地,在Termiminal中输入
git clone https://github.com/2066972218/coolweather.git
,
如图所示,说明克隆成功。
在Android Studio中把项目文件下的CoolWeather/coolweather的所有文件,包括隐藏的.git文件剪切(mv .git .. /
)到CoolWeather文件目录下。
接下来通过在Termiminal中输入一下代码,将CoolWeather项目中的文件上传到Git版本控制中。
git add .
git commit -m "First commit"
git push origin master
在执行最后一条语句时发生一个错误,借助博客链接:
https://blog.csdn.net/jingfengvae/article/details/72859130 解决。
提交成功后,看版本库已经更新成功,也就是我们的代码已经提交值远程代码库了,如图:
也就是我们该项目的版本控制Git创建好了,下面我们来继续项目编码。
4、数据库的创建与配置
创建4个包db、gson、service、util,db包用于存放数据库模型的代码、gson用于存放GSON模型的相关代码,util包用于存储工具相关代码。
为简化数据库的操作我们采用LitePal来管理项目的数据库,先添加好一下我们后续需要用到的依赖闭包:
//用于对数据库进行操作
implementation 'org.litepal.android:core:1.4.1'
//用于进行网络请求
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
//用于JSON解析
implementation 'com.google.code.gson:gson:2.7'
//用于加载和展示图片
implementation 'com.github.bumptech.glide:glide:3.7.0'
在db包下我们创建三张表(实体类):province、city、county分别存放省市县的数据信息。
province实体类如下:
public class Province extends DataSupport {
private int id;//每个实体类都有的字段
private String provinceName;//记录省份名字
private int provinceCode;//记录省的代号
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public int getProvinceCode() {
return provinceCode;
}
public void setProvinceCode(int provinceCode) {
this.provinceCode = provinceCode;
}
}
同理,新建的City类,代码如下:
public class City extends DataSupport {
private int id; //每一个实体类都有一个id
private String cityName; //记录市名称
private int cityCode; //几率市的代码
private int provinceCode; //记录该市的上级省级代码
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public int getCityCode() {
return cityCode;
}
public void setCityCode(int cityCode) {
this.cityCode = cityCode;
}
public int getProvinceCode() {
return provinceCode;
}
public void setProvinceCode(int provinceCode) {
this.provinceCode = provinceCode;
}
}
同理,记录代表区县的County类,如下:
public class County extends DataSupport {
private int id;//每一个实体类都需有一个id
private String countyName; //记录区县名称
private int countyCode;//记录区县代码
private int weatherId;//记录该区县的天气信息
private int cityId;//该区县所属的市级代码
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountyName() {
return countyName;
}
public void setCountyName(String countyName) {
this.countyName = countyName;
}
public int getCountyCode() {
return countyCode;
}
public void setCountyCode(int countyCode) {
this.countyCode = countyCode;
}
public int getWeatherId() {
return weatherId;
}
public void setWeatherId(int weatherId) {
this.weatherId = weatherId;
}
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
}
以上我们也就完成这三个实体类的内容,接下配置数据库
在main目录下创建一个assets的的路径,在该路径下创建一个litepal.xml文件,在该文件输入:
//指定数据库名
//数据库版本号
最后修改AndroidManifest.xml中添加以下代码:
现在数据库配置完毕了,数据库和表会在首次执行自行创建,现在我们将这一阶段的代码提交到版本控制中,即在Terrminal中输入如下:
git add .
git commit -m "加入创建数据库和表的各项配置"
git push origin master
5、加载全国省市县的所有数据
从上面我们知道全国的省市县信息我们都是从服务器中获取的,所有这里我们需要与服务其进行交互。在util中创建一个HttpUtil类。
public class HttpUtil {
public static void sendOKHttpRequest(String adress, okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(adress).build();
client.newCall(request).enqueue(callback);
}
}
根据三的全国地区信息知道我们获取的信息为JSON格式的,需要解析后才能存入数据库,在util文件中新建一个Utility工具类来解析和处理这些信息。如下:
public class Utility {
/*解析和处理服务器返回的省级数据 */
public static boolean handleProvinceResponse(String response){
if (!TextUtils.isEmpty(response)){ //如果返回的数据不为空
try {
//将所有的省级数据解析出来,并组装成实体类对像
JSONArray allProvinces = new JSONArray(response);
for (int i=0;i
解析出省市县的数据后,现在我们来编写界面UI,为后面我们布局复用,因为我们不实用原生的ActionBar
er,故我们在style.xml将其设置为