使用Google Weather API 制作一个简单的天气预报应用
    大家在使用android手机的时候,肯定都是用过天气预报的应用,market上面已经有了不少很成熟的产品.当然,作为开发者而言,一定会对这种应用的开发很感兴趣,我们能不能自己来写一款类似的应用呢? 答案当然是可以的,而且非常的简单,下面我就来给大家介绍一下.
    首先,要开发一款天气预报应用,一定要有一个web服务端来提供数据,这个数据源我们自己肯定是没办法弄的,所以就需要一个第三方机构为我们提供天气数据.这种机构其实有很多,不过大多数都是收费的,当然这些收费的数据源提供的数据会更加丰富详细.如果不想花钱去购买这些收费的数据服务,我们还有另一种替代方案-就是使用免费的天气数据,这篇文章了为大家介绍一个Google 提供的天气API,通过浏览器访问下面的链接:
le/ig/api?hl=zh-cn&weather=Beijing
    如果你的浏览器可以直接显示XML文档,那么就会得到类似下面这样的数据:
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0
">
...
<forecast_conditions>
  <day_of_week data="周四" />
  <low data="4" />
  <high data="19" />
  <icon data="/ig/images/weather/mostly_sunny.gif" />
  <condition data="以晴为主" />
</forecast_conditions>
<forecast_conditions>
  <day_of_week data="周五" />
  <low data="3" />
  <high data="19" />
  <icon data="/ig/images/weather/sunny.gif" />
  <condition data="晴" />
</forecast_conditions>
...
</weather>
    当然,这里只给大家列出一个片断,完整的数据大家可以自己用浏览器来查看.上面这段数据给我们提供了气温的数字和文字描述,还给我们提供了一幅表示当天天气状况的图片。对于我们这个简单的天气应用,这些数据已经足够了。
    有了数据之后,我们就开始开发吧,怎么建项目就不用我说了吧,呵呵。虽然这个应用很简单,但我们还需要把结构稍微整理一下,我们需要用一个实体类来表示天气数据:
public class Weather {
    private String day;
   
    private String lowTemp;
   
    private String highTemp;
   
    private String imageUrl;
private String condition;
}
    我们通过XML文档提供的数据格式来定义我们实体类,这里面包含了,当天是周几,最低气温,最高气温,天气图片的地址,和天气状况的文字描述.为了节省篇幅 getter和setter方法就省略了,现在我们已经把我们需要的数据封装好了.
    接下来我们需要解析XML数据,将服务器返回给我们的XML格式的数据,转换成程序比较好操作的对象,我们可以使用SAX来解析XML文档,关于SAX的更多细节,不是本篇文章要讨论的内容,不过为了让大家好理解,还是简单的叙述一下.
    SAX其实是解析XML文档的一种方法,一般处理XML数据有两种方法,一种是将数据先解析为一种树形结构,然后我们再来在这个结构上访问数据,这种方法是我们通常会直接想到的,而SAX则采用了另外一种方法,这种方法简单来说就是,当解析器遍历XML文档的时候,会给提供我们一些回调函数,比如遇到起始标签,遇到结束标签,或是遇到标签中的文字等等,这是一种基于事件的解析方式,所以我们需要一个类来处理这些事件,并且将需要的数据保存下来,就产生了下面这段代码:
public class XmlHandler extends DefaultHandler {
   
    private List<Weather> weatherList;
   
    private boolean inForcast;
   
    private Weather currentWeather;
   
    public List<Weather> getWeatherList() {
        return weatherList;
    }
    public void setWeatherList(List<Weather> weatherList) {
        this.weatherList = weatherList;
    }
    public XmlHandler() {
       
        weatherList = new ArrayList<Weather>();
        inForcast = false;
       
    }
   
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
       
        String tagName = localName.length() != 0 ? localName : qName;
        tagName = LowerCase();
制作android软件流程       
        if(tagName.equals("forecast_conditions")) {
           
            inForcast = true;
            currentWeather = new Weather();
           
        }
       
        if(inForcast) {
           
            if(tagName.equals("day_of_week")) {               
                currentWeather.Value("data"));
            }else if(tagName.equals("low")) {
                currentWeather.Value("data"));
            }else if(tagName.equals("high")) {
                currentWeather.Value("data"));
            }else if(tagName.equals("icon")) {
                currentWeather.Value("data"));
            }else if(tagName.equals("condition")) {
                currentWeather.Value("data"));
            }
        }
       
    }
   
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        String tagName = localName.length() != 0 ? localName : qName;
        tagName = LowerCase();
       
        if(tagName.equals("forecast_conditions")) {
            inForcast = false;
            weatherList.add(currentWeather);
        }
    }
}
    startElement方法,代表遇到起始标签,我们在这里得到了标签名,如果遇到forecast_conditions标签,我们就会标记一下,并且创建一个天气实体对象,下面的if语句中,判断了是否在forecast_conditions标签内,如果在的话,就把它里面相应的属性提取出来。
    endElement 方法,代表遇到结束标签,我们的代码里,如果遇到forecast_conditions标签,那么就证明当前这条天气数据已经解析完成,所以我们将该实体对象保存到List列表中,以便以后使用。
    通过这段讲解,相信大家对SAX已经有了一个初步的了解,要使用SAX的话,还需要它的jar包,因为它不是标准库中的东西,如果需要更详细的内容,可以参看的我一篇帖子:
    android/viewthread.php?tid=33212&highlight=
    现在终于处理完数据了,其实这个程序本身并不是很复杂,大半的代码都用在了解析数据上面。下面开始进入我们的主程序,首先来看看我们的布局文件:
   
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="schemas.android/apk/res/android"

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。