一、之前项目需要获取天气预报,然而各个API对免费访问次数都有限制,试了很多种方法,决定使用气象台webservice获取。
二、气象台服务的大概情况:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx是由中国气象台提供的通过webservice获取天气预报Web服务,据每2.5小时左右自动更新一次,准确可靠。包括 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预报数据。WebService上提供了多个方法,我们这里要查的是国内城市的天气预报,就用getWeatherbyCityName 这个方法,调用方法如下:输入参数:theCityName = 城市中文名称(国外城市可用英文)或城市代码(不输入默认为上海市),如:上海 或 58367,如有城市名称重复请使用城市代码查询(可通过 getSupportCity 或 getSupportDataSet 获得);返回数据是一个xml形式的数据,用工具解析一下就行了。获取数据的方式也有多种,比如http post/get/soap等,想了解多种方式的可以去webservice上看一下,我用的是http get方法,比较方便。
三、这种方法的优缺点:
1.优点:
1)虽然这种方法仍有访问限制,但由于这种方法不需要传访问Key,访问次数是根据访问IP统计的,所以每台手机每天访问次数都是足够的。PS:这个问题是我在一天不停调试该App请求太多次发现的,一般用户不会没事每天不停打开你的应用,所以这种影响可以忽略;要是你在调试过程中发生这种情况,也可以直接重启设备,又可以正常访问了。
2)返回的数据格式固定(暂时没发现格式变化)而且,我的这种方式访问回来的是xml格式的数据,自己用工具解析一下就好了。
3)输入参数是城市的中文名称,无需用城市代码转换。
2.缺点:
1)因为是免费的服务,所以比付费的服务相对不稳定,我完成到现在两个月的时间,只发现有两天是显示系统维护而取不到数据的。
2)不确定这个服务什么时候会被关闭,所以还是比较适合刚起步的应用或者个人开发。
四、代码:
首先要说明的是,我这里是根据项目需要来解析数据的,我这里只是取了现在的温度和对应的天气图标,但是返回的数据有今明两天比较具体的数据,后面再把数据贴出来。
<pre name="code" class="java">/**获取天气*/
private void loadWeather(){
new Thread(runNow).start();
}
Runnable runNow =new Runnable(){
@Override
public void run() {
try {
URL url = new URL(WSDL + cityname);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
InputStream inStream = conn.getInputStream();
XmlPullParser parser = AbstractPullParser.createXmlPullParser(inStream);
List<String> weatherList = new ArrayList<String>();
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT && event != XmlPullParser.END_TAG) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("string".equalsIgnoreCase(parser.getName())) {
weatherList.add(parser.nextText());
}
break;
default:
break;
}
event = parser.next();
}
if(weatherList.size() > 0){
tempStr = weatherList.get(10);
Pattern pattern = Pattern.compile("[0-9]*℃");
Matcher matcher = pattern.matcher(tempStr);
if(matcher.find()){
tempStr = matcher.group(0);
}else{
tempStr = "";
}
Message msg =new Message();
msg.what = 1;
msg.obj = getImageBitMap(weatherList.get(9));
mHandler.sendMessage(msg);
}else{
Message msg =new Message();
msg.what = 0;
msg.obj = GONE;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
Message msg =new Message();
msg.what = 0;
msg.obj = GONE;
mHandler.sendMessage(msg);
}
}
};
/**获取天气之后更新UI*/
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
setVisibilityView(GONE);
break;
case 1:
setVisibilityView(VISIBLE);
weatherTv.setText(tempStr);
weatherimageM.setImageBitmap((Bitmap) msg.obj);
break;
default:
break;
}
}
};
/**获取assets图片*/
private Bitmap getImageBitMap(String name){
String fileName = "weatherIconNew/"+name;
Bitmap image = null;
AssetManager am = getResources().getAssets();
try{
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}
catch (IOException e){
e.printStackTrace();
}
return image;
}
五、返回数据解析:
返回的数据:
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>广东</string>
<string>广州</string>
<string>59287</string>
<string>59287.jpg</string>
<string>2016-4-16 17:01:04</string>
<string>22℃/27℃</string>
<string>4月16日 小雨</string>
<string>无持续风向微风</string>
<string>7.gif</string>
<string>7.gif</string>
<string>今日天气实况:气温:27℃;风向/风力:东南风 2级;湿度:79%;紫外线强度:最弱。空气质量:良。</string>
<string>
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。 感冒指数:较易发,天凉,湿度大,较易感冒。 穿衣指数:舒适,建议穿长袖衬衫单裤等服装。 洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。 运动指数:较不宜,有降水,推荐您在室内进行休闲运动。 空气污染指数:良,气象条件有利于空气污染物扩散。
</string>
<string>19℃/27℃</string>
<string>4月17日 中到大雨</string>
<string>无持续风向微风</string>
<string>22.gif</string>
<string>22.gif</string>
<string>19℃/24℃</string>
<string>4月18日 阴转多云</string>
<string>无持续风向微风</string>
<string>2.gif</string>
<string>1.gif</string>
<string>
广州是广东省的省会,是中国南方最大的海滨城市,广州位于东经113。17`,北纬23。8`,地处中国大陆南部,广东省南部,珠江三角洲北缘。广州临南海,邻近香港特别行政区,是中国通往世界的南大门,广州属丘陵地带。中国的第三大河----珠江从广州市中心穿流而过。广州是一座历史文化名城。相传在远古时候,曾有五位仙人,身穿五色彩服、骑着嘴衔稻穗的五色仙羊降临此地,把稻穗赠给百姓,祝愿这里永无饥荒。从此,广州便有“羊城”、“穗城”的美称,“五羊”也成为广州的象征。广州既是中国也是世界名城,又是一座古城,因历史上有五羊仙子降临献稻穗的故事,广州又称为“羊城”和“穗城”,简称“穗”;广州一年四季如春、繁花似锦,除夕迎春花市闻名海内外,故又有“花城”的美誉。广州地处低纬,属南亚热带季风气候区。地表接受太阳辐射量较多,同时受季风的影响,夏季海洋暖气流形成高温、高湿、多雨的气候;冬季北方大陆冷风形成低温、干燥、少雨的气候。年平均气温为21.4-21.9度,年降雨量平均为1623.6-1899.8mm,北部多于南部。1982年,广州被国务院选定为全国首批历史文化名城之一,是我国重点旅游城市。1999年1月,广州被评为优秀旅游城市。景观:白云山、莲花山、南海神庙、佛山祖庙、广州动物园等。
</string>
</ArrayOfString>
返回的数据是今明两天的数据,个人调用至今数据的格式还没变过,所以暂时还能放心使用。我这里是将XML的数据解析进List里面,在
<string>今日天气实况:气温:27℃;风向/风力:东南风 2级;湿度:79%;紫外线强度:最弱。空气质量:良。</string>
中通过正则表达式获取当前温度,当然需要温度范围的就比较简单,直接获取就好。具体的数据解析就不细说了,自己看着返回的数据解析吧。
在这里还要说一下天气的图标使用,http://www.webxml.com.cn/zh_cn/weather_icon.aspx这个地址是图标的说明,需要自定义图标的可根据图标的天气解释自己做一些图标,然后改成对应的名字即可。