一、之前項目需要擷取天氣預報,然而各個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這個位址是圖示的說明,需要自定義圖示的可根據圖示的天氣解釋自己做一些圖示,然後改成對應的名字即可。