天天看點

android天氣預報擷取-氣象台webservice

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