【android】第一行代码CoolWeather中遇到的问题

看了很久,一路磕磕绊绊(原因有二:一是因为androidSDK更新太快,书上有些内容有点老了,总是遇到问题; 二是自己遇到问题总想把它放一放自己静静,哈哈哈有病)的到最后的一个实例——coolweather,把过程中遇到的问题总结一下。

中国天气网的API接口

主题:这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)

汉字转URI码

中华万年历的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

JSON数据解析

这个直接放例子,下面是把网站上数据排了一下:

{"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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值