看了很久,一路磕磕绊绊(原因有二:一是因为androidSDK更新太快,书上有些内容有点老了,总是遇到问题; 二是自己遇到问题总想把它放一放自己静静,哈哈哈有病)的到最后的一个实例——coolweather,把过程中遇到的问题总结一下。
主题:这API别用了,换一个。
中国天气网的API用不了了,可以访问
http://www.weather.com.cn/data/list3/city**.xml(**:城市代号)(PS:右键查看页面源代码看到真实数据)
逐级获得省市县的城市代号或者是县的天气代号,这个还是有用的。因为这些城市代号、天气代号都是统一的。但是无法访问
http:www.weather.com.cn/data/cityinfo/****.html(****:天气代号)
这个是在调试过程中发现的,无法返回数据。至于为什么就不清楚了,看网友说是搬去了另一个网站,需要注册帐号,而且使用次数有限,超过次数的话需要付费。想想还是算了,毕竟发现了一个新大陆^&~
有两种查询天气的方式:
http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
http://wthrcdn.etouch.cn/weather_mini?city=%E9%95%BF%E5%AE%89
(后面这堆看不懂的是城市名) x相当于:http://wthrcdn.etouch.cn/weather_mini?city=长安
点进去之后是乱码,改一下编码方式就好了:
![更改方式:](https://img-blog.csdn.net/20161013220222433)
中华万年历的URL可以输入汉字,但是在程序中直接写汉字是没有办法识别的,返回的也是错误的数据,所以需要转码
private void queryWeatherInfo(String weatherCode,String type){
if("city".equals(type)){
try {
weatherCode = URLEncoder.encode(weatherCode,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
String address="http://wthrcdn.etouch.cn/weather_mini?"+type+"="+weatherCode;
Log.d("WeatherActivity",address);
queryFromServer(address,"weatherCode");
}
这块代码在原来的基础上做了一些改变,比如说参数,比如说判断语句。按理说只要改改address就好了,但是有没有发现它的天气里面并没有weatherCode,这样会造成后面写刷新数据的时候只能用城市名插到URL中,所以需要写转码,就会把汉字转换成它能识别的码:
eg:长安==%E9%95%BF%E5%AE%89
这个直接放例子,下面是把网站上数据排了一下:
{"desc":"OK",
"status":1000,
"data":{
"wendu":"16",
"ganmao":"各项气象条件适宜,无明显降温过程,发生感冒机率较低。",
"forecast":[
{"fengxiang":"无持续风向",
"fengli":"微风级",
"high":"高温 18℃",
"type":"多云",
"low":"低温 8℃",
"date":"9日星期天"},
{"fengxiang":"无持续风向",
"fengli":"微风级",
"high":"高温 20℃",
"type":"多云",
"low":"低温 10℃",
"date":"10日星期一"},
{"fengxiang":"北风",
"fengli":"3-4级",
"high":"高温 19℃",
"type":"晴",
"low":"低温 9℃",
"date":"11日星期二"},
{"fengxiang":"无持续风向",
"fengli":"微风级",
"high":"高温 20℃",
"type":"多云",
"low":"低温 11℃",
"date":"12日星期三"},
{"fengxiang":"无持续风向",
"fengli":"微风级",
"high":"高温 22℃",
"type":"晴",
"low":"低温 12℃",
"date":"13日星期四"}],
"yesterday":{
"fl":"4-5级",
"fx":"北风",
"high":"高温 19℃",
"type":"晴",
"low":"低温 5℃",
"date":"8日星期六"},
"aqi":"53",
"city":"北京"}}
我们现在暂时需要的是”city”以及“forcast”里面第一列的”high”、”low”、”type”、”date”等数据:
public static void handleWeatherResponse(Context context, String response){
try {
JSONObject jsonObject=new JSONObject(response);
JSONObject data=jsonObject.getJSONObject("data");
JSONArray forecast=data.getJSONArray("forecast");
String cityName=data.getString("city");
Log.d("Utility",cityName);
JSONObject array1=forecast.getJSONObject(0);
String temp1=array1.getString("high");
String temp2=array1.getString("low");
String weatherDesp=array1.getString("type");
String publishTime=array1.getString("date");
saveWeatherInfo(context,cityName,temp1,temp2,weatherDesp,publishTime);
} catch (JSONException e) {
e.printStackTrace();
}
}
JSON数据中,后面是{}的用JSONObject对象解析(可以把它理解成一个对象),所以data解析的方式是:
JSONObject data=jsonObject.getJSONObject(“data”);
而后面是[]的用JSONArray对象解析(可以把它理解成一个数组),所以forcast解析方式是:
JSONArray forecast=data.getJSONArray(“forecast”);
数组里面的对象是后面是{},所以依旧用JSONObject解析:
JSONObject array1=forecast.getJSONObject(0); (0相当于数组角标)。
主要就遇到了以上几个问题,都一一解决了,嗨森,现在完成了书上的部分还在继续开发^&*,源码粘下面:
https://github.com/Chandelierr/coolweather.git