基於Json和Xml的天氣預報

安卓中實現天氣預報的設計,有兩種解析數據源的方法:Json 解析和XML解析;而對應的天氣預報源也不同;

一.基於Xml解析的天氣預報數據源網址:

http://php.weather.sina.com.cn/xml.php?city=上海&password=DJOYnieT8234jlsK&day=0

其中city部分可替換,但是在開發的時候要注意編碼的問題,在編程中最好寫成如下格式:

path ="http://php.weather.sina.com.cn/xml.php?city="+java.net.URLEncoder.encode("上海","gb2312")+"&password=DJOYnieT8234jlsK&day=0";

 

[源碼]

MainActivity.java

package com.iotek.httpclient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
	private Spinner sp_cities;
	private LinearLayout layout =null;
	private Button btn_dowload = null;
	private ProgressDialog dialog = null;
	private HttpGet get = null;
	private String path = null;
	private HttpClient client = null;// 用來發送請求的一個客戶端類
	private TextView tv_show;
	String cities[] = {"上海","北京","武漢"};
	private ArrayAdapter<String> adapter = null;
	private Weather weather;
	private ImageView img_weather;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViews();
		fillAdapter();
		layout.setBackgroundResource(R.drawable.bg_running_dog);
		client = new DefaultHttpClient();// 創建一個HttpClient對象
		path = "http://php.weather.sina.com.cn/xml.php?city=";
		sp_cities.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				try {
					path ="http://php.weather.sina.com.cn/xml.php?city="
						+java.net.URLEncoder.encode(cities[position],"gb2312")+
							"&password=DJOYnieT8234jlsK&day=0";
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				get = new HttpGet(path);// 封裝一個Get請求
				MyAsynTask task = new MyAsynTask();
				task.execute(get);// 向服務端發送get請求
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				
				
			}
		});
		
	}

	private void findViews() {
		img_weather = (ImageView) findViewById(R.id.img_weather);
		tv_show = (TextView) findViewById(R.id.tv_show);
		sp_cities = (Spinner) findViewById(R.id.sp_cities);
		layout = (LinearLayout) findViewById(R.id.LinearLayout1);
	}

	@Override
	public void onClick(View v) {
		get = new HttpGet(path);// 封裝一個Get請求
		MyAsynTask task = new MyAsynTask();
		task.execute(get);// 向服務端發送get請求
	}

	private void fillAdapter(){
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,cities);
		sp_cities.setAdapter(adapter);
	}
	private class MyAsynTask extends AsyncTask<HttpGet, Void, Weather> {
		@Override
		protected void onPreExecute() {
			dialog = new ProgressDialog(MainActivity.this);
			dialog.setMessage("下載中.....");
			dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			dialog.show();
			super.onPreExecute();
		}

		/*@Override
		protected byte[] doInBackground(HttpGet... params) {
			byte[] result = null;
			try {
				HttpGet httpGet = params[0];// 取出傳過來的Get請求
				// 發送get請求並得到響應內容,所有的內容否封裝在HttpResponse對象中
				HttpResponse response = client.execute(httpGet);
				Header[] allHeaders = response.getAllHeaders();//得到所有的響應都信息
				for(Header head:allHeaders){
					Log.i("info", head.getName()+"---"+head.getValue());
				}
				// 查看狀態行中的狀態碼是否爲200
				if (response.getStatusLine().getStatusCode() == 200) {
					HttpEntity entity = response.getEntity();// 得到響應實體
					result = EntityUtils.toByteArray(entity);
				}
			} catch (Exception e) {
				
			}
			return result;
		}*/
		@Override
		protected Weather doInBackground(HttpGet... params) {
			byte[] result = null;
			String buffer = new String();
			try {
				HttpGet httpGet = params[0];// 取出傳過來的Get請求
				// 發送get請求並得到響應內容,所有的內容否封裝在HttpResponse對象中
				HttpResponse response = client.execute(httpGet);
				/*Header[] allHeaders = response.getAllHeaders();//得到所有的響應都信息
				for(Header head:allHeaders){
					Log.i("info", head.getName()+"---"+head.getValue());
				}*/
				// 查看狀態行中的狀態碼是否爲200
				if (response.getStatusLine().getStatusCode() == 200) {
					HttpEntity entity = response.getEntity();// 得到響應實體
//					result = EntityUtils.toByteArray(entity);
					//buffer = EntityUtils.toString(entity);
					/*InputStream in = entity.getContent();
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					
					String tempStr = "";
					while((tempStr=reader.readLine())!=null){
						buffer= tempStr+"\n";
					}*/
					InputStream is = entity.getContent();
					XMLParseUtil parseUtil = new XMLParseUtil();
					weather = parseUtil.parseXMLByPull(is);
				}
			} catch (Exception e) {
				// TODO: handle exception
			}
			return weather;
		}

		@Override
		protected void onPostExecute(Weather result) {
			dialog.dismiss();
			// 設置要顯示的圖片,把字節數組轉換成BitMap對象
			/*img_show.setImageBitmap(BitmapFactory.decodeByteArray(result, 0,
					result.length));*/
			tv_show.setText(result.getCity()+"  "+result.getStatus1()+"轉"+result.getStatus2()+"  "+
					result.getTemperature1()+"~"+result.getTemperature2()+"度");
			if (result.getStatus1().equals("晴")) {
				img_weather.setBackgroundResource(R.drawable.qing_tian);
			}else if(result.getStatus1().equals("多雲")){
				img_weather.setBackgroundResource(R.drawable.duo_yun);
			}
			super.onPostExecute(result);
		}

	}

}


 //天氣實現類

package com.iotek.httpclient;

public class Weather {
	private String status1,status2;
	private String city;
	private String temperature1,temperature2;
	public String getStatus1() {
		return status1;
	}
	public void setStatus1(String status1) {
		this.status1 = status1;
	}
	public String getStatus2() {
		return status2;
	}
	public void setStatus2(String status2) {
		this.status2 = status2;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getTemperature1() {
		return temperature1;
	}
	public void setTemperature1(String temperature1) {
		this.temperature1 = temperature1;
	}
	public String getTemperature2() {
		return temperature2;
	}
	public void setTemperature2(String temperature2) {
		this.temperature2 = temperature2;
	}
	

}


 //Xml解析

package com.iotek.httpclient;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;
public class XMLParseUtil {
	private Weather weather = null;

	/**
	 * 解析xml輸入流並返回學生對象的集合
	 * 
	 * @param is
	 * @return
	 */
	public Weather parseXMLByPull(InputStream is) throws Exception {
		/*// 1、得到解析器工廠類用來產生解析器對象
		XmlPullParserFactory xpf=XmlPullParserFactory.newInstance();
				
		// 2、由工廠類創建Pull解析器對象
		XmlPullParser xpp = xpf.newPullParser();*/
		XmlPullParser xpp=Xml.newPullParser();
		// 3、開始解析輸入流,確定解析流的編碼方式
		xpp.setInput(is, "utf-8");
        //進入事件解析流程,獲得事件類型
		int eventType = xpp.getEventType();
		//假設沒有解析到最後,就繼續往下解析
		while(eventType!=XmlPullParser.END_DOCUMENT){
			if(eventType==XmlPullParser.START_DOCUMENT){
				
			}else if(eventType==XmlPullParser.START_TAG){
				String tagName=xpp.getName();//獲得當前位置的標籤名
				if(tagName.equals("city")){
					weather=new Weather();
					weather.setCity(xpp.nextText());
				}else if(tagName.equals("status1")){
					weather.setStatus1(xpp.nextText());//獲取當前節點的下一個文本節點
				}else if(tagName.equals("status2")){
					weather.setStatus2(xpp.nextText());//獲取當前節點的下一個文本節點
				}else if(tagName.equals("temperature1")){
					weather.setTemperature1(xpp.nextText());//獲取當前節點的下一個文本節點
				}else if(tagName.equals("temperature2")){
					weather.setTemperature2(xpp.nextText());//獲取當前節點的下一個文本節點
				}
				
			}else if(eventType==XmlPullParser.END_TAG){
				
			}
			
			eventType=xpp.next();//獲得下一個事件
		}

		return weather;
	}

}


二.基於Json解析的天氣預報數據源網址:

http://m.weather.com.cn/data/101010100.html

其中可根據城市的代號來查詢天氣,如上海:101020100.

基於Json解析相對比較簡單,在此只把 核心代碼寫下來

JSONObject jsonObject = new JSONObject(result);
				JSONObject object = jsonObject.getJSONObject("weatherinfo");
				tv_show.setText(object.getString("city")+"  "+object.getString("temp1"));


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章