实战演练——城市天气预报
设计一个城市天气预报的应用,运行效果如下图所示。数据来源可以使用网络提供的免费JSON数据。这里使用http://wthrcdn.etouch.cn/weather_mini?city=北京
数据来源推荐:
(1)国家气象局网站API, 北京是http://www.weather.com.cn/data/cityinfo/101010100.html,它的城市ID是101010100,这个ID是一个9位的数字,按照长度可以分为4部分:101(国家代号)、01(省)、01(二级地区)、00(三级地区)。
(2)本书第9章项目用到的天气数据接口,调用方法如下:
http://wthrcdn.etouch.cn/weather_mini?city=北京 //通过城市名字获得json天气数据
http://wthrcdn.etouch.cn/weather_mini?citykey=+cityCode //通过城市 id 获得json天气数据,例如
http://wthrcdn.etouch.cn/weather_mini?citykey=101010100 //北京
例如,深圳的城市代码为101280601,
则调用地址是http://wthrcdn.etouch. cn/weather_mini?citykey=101280601。
API返回的JSON数据样本如下:
{"data":{"yesterday":{"date":"15日星期日","high":"高温 29℃","fx":"无持续风向","low":"低温 25℃","fl":"<![CDATA[<3级]]>","type":"中雨"},"city":"深圳","aqi":"27","forecast":[{"date":"16日星期一","high":"高温 31℃","fengli":"<![CDATA[<3级]]>","low":"低温 26℃","fengxiang":"无持续风向","type":"多云"},{"date":"17日星期二","high":"高温 33℃","fengli":"<![CDATA[<3级]]>","low":"低温 27℃","fengxiang":"无持续风向","type":"雷阵雨"},{"date":"18日星期三","high":"高温 34℃","fengli":"<![CDATA[<3级]]>","low":"低温 27℃","fengxiang":"无持续风向","type":"阵雨"},{"date":"19日星期四","high":"高温 34℃","fengli":"<![CDATA[4-5级]]>","low":"低温 27℃","fengxiang":"东北风","type":"阵雨"},{"date":"20日星期五","high":"高温 34℃","fengli":"<![CDATA[5-6级]]>","low":"低温 28℃","fengxiang":"东北风","type":"阵雨"}],"ganmao":"各项气象条件适宜,发生感冒概率较低。但请避免长期处于空调房间中,以防感冒。","wendu":"31"},"status":1000,"desc":"OK"}
可以使用在线JSON视图查看器,或者给浏览器安装JsonView插件,使用JSON视图看上述数据,结果如下:
{
"data": {
"yesterday": {
"date": "15日星期日",
"high": "高温 29℃",
"fx": "无持续风向",
"low": "低温 25℃",
"fl": "<![CDATA[<3级]]>",
"type": "中雨"
},
"city": "深圳",
"aqi": "27",
"forecast": [{
"date": "16日星期一",
"high": "高温 31℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 26℃",
"fengxiang": "无持续风向",
"type": "多云"
}, {
"date": "17日星期二",
"high": "高温 33℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "雷阵雨"
}, {
"date": "18日星期三",
"high": "高温 34℃",
"fengli": "<![CDATA[<3级]]>",
"low": "低温 27℃",
"fengxiang": "无持续风向",
"type": "阵雨"
}, {
"date": "19日星期四",
"high": "高温 34℃",
"fengli": "<![CDATA[4-5级]]>",
"low": "低温 27℃",
"fengxiang": "东北风",
"type": "阵雨"
}, {
"date": "20日星期五",
"high": "高温 34℃",
"fengli": "<![CDATA[5-6级]]>",
"low": "低温 28℃",
"fengxiang": "东北风",
"type": "阵雨"
}],
"ganmao": "各项气象条件适宜,发生感冒概率较低。但请避免长期处于空调房间中,以防感冒。",
"wendu": "31"
},
"status": 1000,
"desc": "OK"
}
(3)聊天机器人,含天气预报 http://api.qingyunke.com/
(4)其他免费稳定的天气预报API,参考阅读https://www.jianshu.com/p/e3e04cf3fc0f
不安装Volley库,直接使用Volley,可以手工修改工程的build.gradle,添加一句代码在dependencies 下面:
implementation 'com.android.volley:volley:1.1.0'
参考下图:

操作示范如下(时长25:41)
Jason数据来源于 http://wthrcdn.etouch.cn/weather_mini?city=北京
WeatherActivity.java来源于案例7-4,由于Jason数据内容不同,提取数据有所区别,具体如下:
//第3个参数,服务器响应成功的回调
new Response.Listener<JSONObject>(){
@Override
public void onResponse(JSONObject response) {
try {
JSONObject mjson=response.getJSONObject("data");
String city=mjson.getString("city");
String wendu=mjson.getString("wendu");
String ganmao=mjson.getString("ganmao");
txt.setText(city+"\n"+wendu+"度,"+ganmao);
Log.i("天气", city+wendu+ganmao);
JSONArray forecast=mjson.getJSONArray("forecast");
for (int i=0; i<forecast.length();i++){
JSONObject ob = forecast.getJSONObject(i);
String str = ob.getString("date")+":"
+ob.getString("high")+"-"
+ob.getString("low")+","
+ob.getString("type");
txt.append("\n"+str);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
//第4个参数,服务器响应失败的回调
......
素材:一张图片


