实验三 综合示例设计与开发-“天气预报服务”软件

实验三 综合示例设计与开发-“天气预报服务”软件

一、实验目的
(1)理解Android 软件开发从准备策划工作开始到软件发布全过程;
(2)掌握使用多种组件进行Android程序开发的方法。
二、实验环境
(1) 硬件:PC 机,其它相关硬件 ;
(2)软件:Windows XP,Android Studio集成开发环境,Android Development Tools插件。
三、实验内容及 要求
(1)实现“天气预报服务”软件的开发与测试。
四、实验步骤
解决问题的思路:
 实时天气数据从哪来?
 有了数据来源后如何获取?
 获取到的数据格式如何解析?
 如何在Android平台下呈现?
具体说明:
1、 实时天气数据从哪来?
接口用的百度的天气接口
http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=yourkey

2、 有了数据来源后如何获取?
Apache HttpClient:
Apache HttpClient是一个兼容HTTP/1.1的HTTP代理实现,提供了可重用的组件,客户端认证,HTTP状态管理,HTTP连接管理。

3、 获取到的数据格式如何解析?
通过HttpClient访问WebXml服务器,返回的数据是一个XML格式的字符串,那么我们应该如何处理这个XML呢?
1) 使用DOM技术解析
2) 使用SAX技术解析
3) 使用PULL技术解析
XmlPull(http://www.xmlpull.org/)
Android平台集成了XmlPull组件
XmlPull的原理实现与SAX原理相似,为事件驱动。
XmlPull中把事件分为不同的类型标记:
— START_DOCUMENT 0
— END_ DOCUMENT 1
— START_TAG 2
— END_TAG 3
— TEXT 4
4、 如何在Android平台下呈现?
通过XmlPull组件我们把xml数据已可以很方便的解析出来,放入一个List集合中,下面我们将利用Android UI组件把List的相关内容呈现在屏幕上。
我们将使用以下UI组件:
 TextView
 ImageView
 Button
 LinnerLayout
在这里插入图片描述
在这里插入图片描述

1、 界面设计
城市用spinner控件实现选择。效果如下图所示:
在这里插入图片描述

界面代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg2"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <LinearLayout
        android:id="@+id/address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
        <Spinner
            android:id="@+id/spinner2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1" />
        <Spinner
            android:id="@+id/spinner3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/index"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/tvCity"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_weight="1" />
        <TextView
            android:id="@+id/tvPM25"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1" />
        <TextView
            android:id="@+id/tvDate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <LinearLayout
            android:id="@+id/lyWeather1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/tvweek1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwea1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic11"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic12"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwind1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvtemper1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/lyWeather2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/tvweek2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwea2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic21"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic22"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwind2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvtemper2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/lyWeather3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_weight="1"
            android:orientation="vertical" >
            <TextView
                android:id="@+id/tvweek3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwea3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic31"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <ImageView
                android:id="@+id/ivpic32"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvwind3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
            <TextView
                android:id="@+id/tvtemper3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

2、 城市列表数据设置
在res文件夹下新建raw文件夹,并在文件夹下新建citys_weather.xml文件,实现全国城市列表信息。
在这里插入图片描述
3、 封装各信息类
在这里插入图片描述
1)其中City.java文件实现城市信息的封装,代码如下:

public class City {
   
	private String id;
	private String name;
	private List<District> disList;
	public City() {
   
	}
	public City(String id, String name, List<District> disList) {
   
		super();
		this.id = id;
		this.name = name;
		this.disList = disList;
	}
	public String getId() {
   
		return id;
	}
	public void setId(String id) {
   
		this.id = id;
	}
	public String getName() {
   
		return name;
	}
	public void setName(String name) {
   
		this.name = name;
	}
	public List<District> getDisList() {
   
		return disList;
	}
	public void setDisList(List<District> disList) {
   
		this.disList = disList;
	}
	@Override
	public String toString() {
   
		return name;
	}
}

**2)District.java文件实现市区信息封装,代码如下:

public class District {
   
	private String id;
	private String name;
	public String getId() {
   
		return id;
	}
	public void setId(String id) {
   
		this.id = id;
	}
	public String getName() {
   
		return name;
	}
	public void setName(String name) {
   
		this.name = name;
	}

	@Override
	public String toString() {
   
		return name;
	}
}

3)Province.java文件实现省份信息封装,代码如下:

public class Province {
   
	private String id;
	private String name;
	private List<City> citys;

	public String getId() {
   
		return id;
	}
	public void setId(String id) {
   
		this.id = id;
	}
	public String getName() {
   
		return name;
	}
	public void setName(String name) {
   
		this.name = name;
	}
	public List<City> getCitys() {
   
		return citys;
	}
	public void setCitys(List<City> citys) {
   
		this.citys = citys;
	}
	@Override
	public String toString() {
   
		return name;
	}
}

4)Index.java文件实现天气索引信息的封装,代码如下:

public class Index {
   
	private String title;
	private String zs;
	private String tipt;
	private String des;

	public Index() {
   
	}

	public Index(String title, String zs, String tipt, String des) {
   
		this.title = title;
		this.zs = zs;
		this.tipt = tipt;
		this.des = des;
	}

	public String getTitle() {
   
		return title;
	}

	public void setTitle(String title) {
   
		this.title = title;
	}

	public String getZs() {
   
		return zs;
	}

	public void setZs(String zs) {
   
		this.zs = zs;
	}

	public String getTipt() {
   
		return tipt;
	}

	public void setTipt(String tipt) {
   
		this.tipt = tipt;
	}

	public String getDes() {
   
		return des;
	}

	public void setDes(String des) {
   
		this.des = des;
	}

	@Override
	public String toString() {
   
		return "{des:" + des + ", tipt:" + tipt + ", title:" + title + ", zs:"
				+ zs + "}";
	}

}


5)Result.java文件实现当前选择城市的天气信息的封装,代码如下:

public class Result {
   
	private String currentCity;
	private String pm25;
	private List<Index> index;
	private List<Weather_data> weather_data;
	public Result() {
   
	}
	public Result(String currentCity, String pm25, List<Index> index,
			List<Weather_data> weatherData) {
   
		this.currentCity = currentCity;
		this.pm25 = pm25;
		this.index = index;
		weather_data = weatherData;
	}
	public String getCurrentCity() {
   
		return currentCity;
	}
	public void setCurrentCity(String currentCity) {
   
		this.currentCity = currentCity;
	}
	public String getPm25() {
   
		return pm25;
	}
	public void setPm25(String pm25) {
   
		this.pm25 = pm25;
	}
	public List<Index> getIndex() {
   
		return index;
	}

	public void setIndex(List<Index> index) {
   
		this.index = index;
	}
	public List<Weather_data> getWeather_data() {
   
		return weather_data;
	}
	public void setWeather_data(List<Weather_data> weatherData) {
   
		weather_data = weatherData;
	}
	@Override
	public String toString() {
   
		return "{currentCity:" + currentCity + ", index:" + index + ", pm25:"
				+ pm25 + ", weather_data:" + weather_data + "}";
	}
}

6)Weather_data.java文件实现天气数据信息的封装,代码如下:

public class Weather_data {
   
	private String date;
	private String dayPictureUrl;
	private Bitmap dayPicture;
	private String nightPictureUrl;
	private Bitmap nightPicture;
	private String weather;
	private String wind;
	private String temperature;

	public Weather_data() {
   
	}

	public Weather_data(String date, String dayPictureUrl,
			String nightPictureUrl, String weather, String wind,
			String temperature) {
   
		this.date = date;
		this.dayPictureUrl = dayPictureUrl;
		this.nightPictureUrl = nightPictureUrl;
		this.weather = weather;
		this.wind = wind;
		this.temperature = temperature;
	}

	public Bitmap getDayPicture() {
   
		return dayPicture;
	}

	public void setDayPicture(Bitmap dayPicture) {
   
		this.dayPicture = dayPicture;
	}

	public Bitmap getNightPicture() {
   
		return nightPicture;
	}

	public void setNightPicture(Bitmap nightPicture) {
   
		this.nightPicture = nightPicture;
	}

	public String getDate() {
   
		return date;
	}

	public void setDate(String date) {
   
		this.date = date;
	}

	public String getDayPictureUrl() {
   
		return dayPictureUrl;
	}

	public void setDayPictureUrl(String dayPictureUrl) {
   
		this.dayPictureUrl = dayPictureUrl;
	}

	public String getNightPictureUrl() {
   
		return nightPictureUrl;
	}

	public void setNightPictureUrl(String nightPictureUrl) {
   
		this.nightPictureUrl = nightPictureUrl;
	}

	public String getWeather() {
   
		return weather;
	}

	public void setWeather(String weather) {
   
		this.weather = weather;
	}

	public String getWind() {
   
		return wind;
	}

	public void setWind(String wind) {
   
		this.wind = wind;
	}

	public String getTemperature() {
   
		return temperature;
	}

	public void setTemperature(String temperature) {
   
		this.temperature = temperature;
	}

	@Override
	public String toString() {
   
		return "{date:" + date + ", dayPictureUrl:" + dayPictureUrl
				+ ", nightPictureUrl:" + nightPictureUrl + ", temperature:"
				+ temperature + ", weather:" + weather + ", wind:" + wind + "}";
	}

}


6)Weather.java文件实现其他信息的封装,代码如下:

public class Weather {
   
	private String error;
	private String status;
	private String date;
	private List<Result> results;

	public Weather() {
   
	}

	public Weather(String error, String status, String date,
			List<Result> results) {
   
		this.error = error;
		this.status = status;
		this.date = date;
		this.results = results;
	}

	public String getError() {
   
		return error;
	}

	public void setError(String error) {
   
		this.error = error;
	}

	public String getStatus() {
   
		return status;
	}

	public void setStatus(String status) {
   
		this.status = status;
	}

	public String getDate() {
   
		return date;
	}

	public void setDate(String date) {
   
		this.date = date;
	}

	public List<Result> getResults() {
   
		return results;
	}

	public void setResults(List<Result> results) {
   
		this.results = results;
	}

	@Override
	public String toString() {
   
		return "{date:" + date + ", error:" + error + ", results:" + results
				+ ", status:" + status + "}";
	}

}

4、 数据获取与解析
HttpUtils文件实现数据获取与解析,代码如下:

public class HttpUtils {
   

	public static String getURl(String location) {
   
		String url = "http://api.map.baidu.com/telematics/v3/weather?location="
				+ location + "&output=json&ak=B95329fb7fdda1e32ba3e3a245193146";
		return url;
	}

	public static String getJsonStr(String url) {
   
		HttpGet get = new HttpGet(url);
		HttpClient client = new DefaultHttpClient();
		HttpResponse response;
		try {
   
			response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
   
				InputStream in = response.getEntity().getContent();

				return getResult(in);
			}
		} catch (ClientProtocolException e) {
   
			e.printStackTrace();
		} catch (IOException e) {
   
			e.printStackTrace();
		}
		return null;
	}

	public static Bitmap getImage(String imageUrl) {
   
		HttpGet get = new HttpGet(imageUrl);
		HttpClient client = new DefaultHttpClient();
		HttpResponse response;
		try {
   
			response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
   
				InputStream in = response.getEntity().getContent();
				Bitmap bm = BitmapFactory.decodeStream(in);
				return bm;
			}
		} catch (ClientProtocolException e) {
   
			e.printStackTrace();
		} catch (IOException e) {
   
			e.printStackTrace();
		}
		return null;
	}

	public static String getJsonStr2(String url) {
   
		URL url2 = null;
		try {
   
			url2 = new URL(url);
		} catch (MalformedURLException e1) {
   
			e1.printStackTrace();
		}
		HttpURLConnection conn;
		try {
   
			conn = (HttpURLConnection) url2.openConnection();
			conn.setDoInput(true);
			conn.setConnectTimeout(5000);
			conn.setRequestMethod("GET");

			if (conn.getResponseCode() == 200) {
   
				InputStream in = conn.getInputStream();
				return getResult(in);
			}
		} catch (IOException e) {
   
			e.printStackTrace();
		}
		return null;
	}

	private static String getResult(InputStream in) {
   
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		byte[] b = new byte[1024];
		int len = 0;
		try {
   
			while ((len = in.read(b)) != -1) {
   
				bos.write(b, 0, len);
				bos.flush();
			}
			// System.out.println(new String(bos.toByteArray(), "utf-8"));
			return new String(bos.toByteArray(), "utf-8");
		} catch (IOException e) {
   
			e.printStackTrace();
		}
		return null;
	}

	public static Weather fromJson2(String jsonStr) {
   
		// Weather obj = JSON.parseObject(jsonStr, Weather.class);
		// return obj;
		return null;
	}

	public static Weather fromJson(String jsonStr) {
   
		try {
   
			JSONObject obj = new JSONObject(jsonStr);
			String error = obj.getString("error");
			String status = obj.getString("status");
			String date = obj.getString("date");
			// 根据具体的error值返回不同的信息,这儿做了统一处理,返回null;
			if (Integer.parseInt(error) != 0) {
   
				return null;
			} else {
   
				Weather wea = new Weather();
				wea.setError(error);
				wea.setStatus(status);
				wea.setDate(date);
				// results信息
				List<Result> results = new ArrayList<Result>();
				JSONArray rArr = obj.getJSONArray("results");
				for (int i = 0; i < rArr.length(); i++) {
   
					JSONObject rObj = rArr.getJSONObject(i);
					Result res = new Result();
					res.setCurrentCity(rObj.getString("currentCity"));
					res.setPm25(rObj.getString("pm25"));
					// index信息
					List<Index> index = new ArrayList<Index>();
					JSONArray iArr = rObj.getJSONArray("index");
					for (int j = 0; j < iArr.length(); j++) {
   
						JSONObject iObj = iArr.getJSONObject(i);
						Index ind = new Index();
						ind.setTitle(iObj.getString("title"));
						ind.setZs(iObj.getString("zs"));
						ind.setTipt(iObj.getString("tipt"));
						ind.setDes(iObj.getString("des"));
						index.add(ind);
					}
					res.setIndex(index);
					// weather_data信息
					List<Weather_data> weather_data = new ArrayList<Weather_data>();
					JSONArray wArr = rObj.getJSONArray("weather_data");
					for (int j = 0; j < wArr.length(); j++) {
   
						JSONObject wObj = wArr.getJSONObject(j);
						Weather_data wd = new Weather_data();
						wd.setDate(wObj.getString("date"));
						wd.setDayPictureUrl(wObj.getString("dayPictureUrl"));
						wd.setNightPictureUrl(wObj.getString("nightPictureUrl"));
						wd.setWeather(wObj.getString("weather"));
						wd.setWind(wObj.getString("wind"));
						wd.setTemperature(wObj.getString("temperature"));
						weather_data.add(wd);
					}
					res.setWeather_data(weather_data);
					res.setIndex(index);
					results.add(res);
				}
				wea.setResults(results);
				return wea;
			}
		} catch (JSONException e) {
   
			e.printStackTrace();
		}
		return null;
	}

	// 解析xml文件

	public static List<Province> getProvinces(Context context)
			throws XmlPullParserException, IOException {
   
		List<Province> provinces = null;
		Province province = null;
		List<City> citys = null;
		City city = null;
		List<District> districts = null;
		District district = null;

		InputStream in = context.getResources().openRawResource(
				R.raw.citys_weather);

		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		parser.setInput(in, "utf-8");
		int event = parser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
   
			switch (event) {
   
			case XmlPullParser.START_DOCUMENT:
				provinces = new ArrayList<Province>();
				break;
			case XmlPullParser.START_TAG:
				String tagName = parser.getName();
				if ("p".equals(tagName)) {
   
					province = new Province();
					citys = new ArrayList<City>();
					int count = parser.getAttributeCount();
					for (int i = 0; i < count; i++) {
   
						String attrName = parser.getAttributeName(i);
						String attrValue = parser.getAttributeValue(i);
						if ("p_id".equals(attrName))
							province.setId(attrValue);
					}
				}
				if ("pn".equals(tagName)) {
   
					province.setName(parser.nextText());
				}
				if ("c".equals(tagName)) {
   
					city = new City();
					districts = new ArrayList<District>();
					int count = parser.getAttributeCount();
					for (int i = 0; i < count; i++) {
   
						String attrName = parser.getAttributeName(i);
						String attrValue = parser.getAttributeValue(i);
						if ("c_id".equals(attrName))
							city.setId(attrValue);
					}
				}
				if ("cn".equals(tagName)) {
   
					city.setName(parser.nextText());
				}
				if ("d".equals(tagName)) {
   
					district = new District();
					int count = parser.getAttributeCount();
					for (int i = 0; i < count; i++) {
   
						String attrName = parser.getAttributeName(i);
						String attrValue = parser.getAttributeValue(i);
						if ("d_id".equals(attrName))
							district.setId(attrValue);
					}
					district.setName(parser.nextText());
					districts.add(district);
				}
				break;
			case XmlPullParser.END_TAG:
				if ("c".equals(parser.getName())) {
   
					city.setDisList(districts);
					citys.add(city);
				}
				if ("p".equals(parser.getName())) {
   
					province.setCitys(citys);
					provinces.add(province);
				}

				break;

			}
			event = parser.next();

		}
		return provinces;
	}

	public static List<Map<String, Object>> toListMap(Result r) {
   
		//从result中获取到天气信息,并将image转化为bitmap存入list
		return null;
	}
}

5、 交互界面显示
MainActivity.java文件实现交互功能及界面显示,代码如下:

public class MainActivity extends Activity {
   
	private Spinner sp_province;
	private Spinner sp_city;
	private Spinner sp_district;
	private int currentPro;
	private ArrayAdapter<Province> provinceAdapter;
	private ArrayAdapter<City> cityAdapter;
	private ArrayAdapter<District> districtAdapter;
	private List<Province> provinces;

	private TextView tvCity;
	private TextView tvPM25;
	private TextView tvDate;
	private ImageView ivpic11;
	private ImageView ivpic12;
	private TextView tvweek1;
	private TextView tvwea1;
	private TextView tvwind1;
	private TextView tvtemper1;

	private ImageView ivpic21;
	private ImageView ivpic22;
	private TextView tvweek2;
	private TextView tvwea2;
	private TextView tvwind2;
	private TextView tvtemper2;

	private ImageView ivpic31;
	private ImageView ivpic32;
	private TextView tvweek3;
	private TextView tvwea3;
	private TextView tvwind3;
	private TextView tvtemper3;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
   
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sp_province = (Spinner) findViewById(R.id.spinner1);
		sp_city = (Spinner) findViewById(R.id.spinner2);
		sp_district = (Spinner) findViewById(R.id.spinner3);
		tvCity = (TextView) findViewById(R.id.tvCity);
		tvPM25 = (TextView) findViewById(R.id.tvPM25);
		tvDate = (TextView) findViewById(R.id.tvDate);

		// 第二个城市
		ivpic21 = (ImageView) findViewById(R.id.ivpic21);
		ivpic22 = (ImageView) findViewById(R.id.ivpic22);

		tvweek2 = (TextView) findViewById(R.id.tvweek2);
		tvwea2 = (TextView) findViewById(R.id.tvwea2);
		tvwind2 = (TextView) findViewById(R.id.tvwind2);
		tvtemper2 = (TextView) findViewById(R.id.tvtemper2);

		// 第三个城市
		ivpic31 = (ImageView) findViewById(R.id.ivpic31);
		ivpic32 = (ImageView) findViewById(R.id.ivpic32);

		tvweek3 = (TextView) findViewById(R.id.tvweek3);
		tvwea3 = (TextView) findViewById(R.id.tvwea3);
		tvwind3 = (TextView) findViewById(R.id.tvwind3);
		tvtemper3 = (TextView) findViewById(R.id.tvtemper3);

		// 第一个城市
		ivpic11 = (ImageView) findViewById(R.id.ivpic11);
		ivpic12 = (ImageView) findViewById(R.id.ivpic12);

		tvweek1 = (TextView) findViewById(R.id.tvweek1);
		tvwea1 = (TextView) findViewById(R.id.tvwea1);
		tvwind1 = (TextView) findViewById(R.id.tvwind1);
		tvtemper1 = (TextView) findViewById(R.id.tvtemper1);

		// 获取到地区信息
		try {
   
			provinces = HttpUtils.getProvinces(this);
		} catch (XmlPullParserException e) {
   
			e.printStackTrace();
		} catch (IOException e) {
   

			e.printStackTrace();
		}
		// adapter,填充信息
		provinceAdapter = new ArrayAdapter<Province>(this,
				android.R.layout.simple_spinner_item, android.R.id.text1,
				provinces);
		provinceAdapter
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		sp_province.setAdapter(provinceAdapter);

		cityAdapter = new ArrayAdapter<City>(this,
				android.R.layout.simple_spinner_item, android.R.id.text1,
				provinces.get(0).getCitys());
		cityAdapter
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		sp_city.setAdapter(cityAdapter);

		districtAdapter = new ArrayAdapter<District>(this,
				android.R.layout.simple_spinner_item, android.R.id.text1,
				provinces.get(0).getCitys().get(0).getDisList());
		districtAdapter
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		sp_district.setAdapter(districtAdapter);
		// 当选择省份时,城市和地方列表会变化
		sp_province.setOnItemSelectedListener(new OnItemSelectedListener() {
   

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
   
				currentPro = position;
				cityAdapter = new ArrayAdapter<City>(MainActivity.this,
						android.R.layout.simple_spinner_item,
						android.R.id.text1, provinces.get(position).getCitys());
				cityAdapter
						.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
				sp_city.setAdapter(cityAdapter);
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
   
			}
		});
		// 当选择城市时,地方列表会变化
		sp_city.setOnItemSelectedListener(new OnItemSelectedListener() {
   

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
   
				districtAdapter = new ArrayAdapter<District>(MainActivity.this,
						android.R.layout.simple_spinner_item,
						android.R.id.text1, provinces.get(currentPro)
								.getCitys().get(position).getDisList());
				districtAdapter
						.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
				sp_district.setAdapter(districtAdapter);
			}

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

			}
		});
		// 当选择地方时,显示具体的天气情况
		sp_district.setOnItemSelectedListener(new OnItemSelectedListener() {
   
			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
   
				// 选择的城市
				District dis = districtAdapter.getItem(position);
				// Log.i("i", dis.getName());
				new WeatherAsyncTask().execute(dis.getName());
			}

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

	// 异步类,获取天气数据
	class WeatherAsyncTask extends AsyncTask<String, Void, Weather> {
   

		@Override
		protected Weather doInBackground(String... params) {
   
			String url = HttpUtils.getURl(params[0]);
			String jsonStr = HttpUtils.getJsonStr(url);
			Weather weather = HttpUtils.fromJson(jsonStr);
			Result r = weather.getResults().get(0);
			/*List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
			list = HttpUtils.toListMap(r);*/
			for(int i = 0;i<3;i++){
   
				Weather_data w = r.getWeather_data().get(i);
				w.setDayPicture(HttpUtils.getImage(w.getDayPictureUrl()));
				w.setNightPicture(HttpUtils.getImage(w.getNightPictureUrl()));
			}
			return weather;
		}

		@Override
		protected void onPostExecute(Weather result ) {
   
			Result res = result.getResults().get(0);
			Weather_data wa = res.getWeather_data().get(0);
			// System.out.println(res.getWeather_data());
			tvCity.setText("城市:" + res.getCurrentCity());
			String pm2_5 = "".equals(res.getPm25()) ? "75" : res.getPm25();
//			Log.i("i",res.getPm25()+"wwwww");
			tvPM25.setText("PM2.5:" + pm2_5);
			tvDate.setText("日期:" + result.getDate());
			// 应该为从网络上获取到的
//			ivpic11.setImageResource(R.drawable.d00);
//			ivpic12.setImageResource(R.drawable.d01);
			ivpic11.setImageBitmap(wa.getDayPicture());
			ivpic12.setImageBitmap(wa.getNightPicture());
			String str = wa.getDate();
			tvweek1.setText(str.substring(0, 2));
			tvwea1.setText(wa.getWeather());
			tvwind1.setText(wa.getWind());
			tvtemper1.setText(str.substring(14, str.length()-1));

			wa = res.getWeather_data().get(1);
			// System.out.println(wa2);

			tvtemper2.setText(wa.getTemperature());
			ivpic21.setImageBitmap(wa.getDayPicture());
			ivpic22.setImageBitmap(wa.getNightPicture());
			tvweek2.setText(wa.getDate());
			tvwea2.setText(wa.getWeather());
			tvwind2.setText(wa.getWind());
			tvtemper2.setText(wa.getTemperature());

			wa = res.getWeather_data().get(2);

			// System.out.println(wa4);
			ivpic31.setImageBitmap(wa.getDayPicture());
			ivpic32.setImageBitmap(wa.getNightPicture());
			tvweek3.setText(wa.getDate());
			tvwea3.setText(wa.getWeather());
			tvwind3.setText(wa.getWind());
			tvtemper3.setText(wa.getTemperature());
		}
	}
}


6.citys weather.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!-- START_DOCUMET:第一个节点
 	END_DOCUMET:尾节点
	START_TAG:其他的首部的节点 p pn c cn...
	END_TAG:其他的尾部的节点 </p> </c> ...
 -->
<citylist>
	<p p_id = "01">
		<pn>北京</pn>
		<c c_id="0101">
		    <cn>北京</cn>
			<d d_id="101010101">北京</d>
			<d d_id="101010200">海淀</d>
			<d d_id="101010300">朝阳</d>
			<d d_id="101010400">顺义</d>
			<d d_id="101010500">怀柔</d>
			<d d_id="101010600">通州</d>
			<d d_id="101010700">昌平</d>
			<d d_id="101010800">延庆</d>
			<d d_id="101010900">丰台</d>
			<d d_id="101011000">石景山</d>
			<d d_id="101011100">大兴</d>
			<d d_id="101011200">房山</d>
			<d d_id="101011300">密云</d>
			<d d_id="101011400">门头沟</d>
			<d d_id="101011500">平谷</d>
		</c>
	</p>

	<p p_id = "02">
	<pn>上海</pn>
		<c c_id="0201"><cn>上海</cn>
				<d d_id="101020100">上海</d>
				<d d_id="101020200">闵行</d>
				<d d_id="101020300">宝山</d>
				<d d_id="101020500">嘉定</d>
				<d d_id="101020600">浦东南汇</d>
				<d d_id="101020700">金山</d>
				<d d_id="101020800">青浦</d>
				<d d_id="101020900">松江</d>
				<d d_id="101021000">奉贤</d>
				<d d_id="101021100">崇明</d>
				<d d_id="101021200">徐家汇</d>
				<d d_id="101021300">浦东</d>
			</c>
		</p>

<p p_id = "03">
	<pn>天津</pn>
		<c c_id="0301"><cn>天津</cn>
				<d d_id="101030100">天津</d>
				<d d_id="101030200">武清</d>
				<d d_id="101030300">宝坻</d>
				<d d_id="101030400">东丽</d>
				<d d_id="101030500">西青</d>
				<d d_id="101030600">北辰</d>
				<d d_id="101030700">宁河</d>
				<d d_id="101030800">汉沽</d>
				<d d_id="101030900">静海</d>
				<d d_id="101031000">津南</d>
				<d d_id="101031100">塘沽</d>
				<d d_id="101031200">大港</d>
				<d d_id="101031400">蓟县</d>
			</c>
		</p>

<p p_id = "04">
	<pn>重庆</pn>
		<c c_id="0401"><cn>重庆</cn>
				<d d_id="101040100">重庆</d>
				<d d_id="101040200">永川</d>
				<d d_id="101040300">合川</d>
				<d d_id="101040400">南川</d>
				<d d_id="101040500">江津</d>
				<d d_id="101040600">万盛</d>
				<d d_id="101040700">渝北</d>
				<d d_id="101040800">北碚</d>
				<d d_id="101040900">巴南</d>
				<d d_id="101041000">长寿</d>
				<d d_id="101041100">黔江</d>
				<d d_id="101041300">万州</d>
				<d d_id="101041400">涪陵</d>
				<d d_id="101041500">开县</d>
				<d d_id="101041600">城口</d>
				<d d_id="101041700">云阳</d>
				<d d_id="101041800">巫溪</d>
				<d d_id="101041900">奉节</d>
				<d d_id="101042000">巫山</d>
				<d d_id="101042100">潼南</d>
				<d d_id="101042200">垫江</d>
				<d d_id="101042300">梁平</d>
				<d d_id="101042400">忠县</d>
				<d d_id="101042500">石柱</d>
				<d d_id="101042600">大足</d>
				<d d_id="101042700">荣昌</d>
				<d d_id="101042800">铜梁</d>
				<d d_id="101042900">璧山</d>
				<d d_id="101043000">丰都</d>
				<d d_id="101043100">武隆</d>
				<d d_id="101043200">彭水</d>
				<d d_id="101043300">綦江</d>
				<d d_id="101043400">酉阳</d>
				<d d_id="101043600">秀山</d>
			</c>
		</p>

<p p_id = "05">
	<pn>黑龙江</pn>
		<c c_id="0501"><cn>哈尔滨</cn>
				<d d_id="101050101">哈尔滨</d>
				<d d_id="101050102">双城</d>
				<d d_id="101050103">呼兰</d>
				<d d_id="101050104">阿城</d>
				<d d_id="101050105">宾县</d>
				<d d_id="101050106">依兰</d>
				<d d_id="101050107">巴彦</d>
				<d d_id="101050108">通河</d>
				<d d_id="101050109">方正</d>
				<d d_id="101050110">延寿</d>
				<d d_id="101050111">尚志</d>
				<d d_id="101050112">五常</d>
				<d d_id="101050113">木兰</d>
			</c>
		<c c_id="0502"><cn>齐齐哈尔</cn>
				<d d_id="101050201">齐齐哈尔</d>
				<d d_id="101050202">讷河</d>
				<d d_id="101050203">龙江</d>
				<d d_id="101050204">甘南</d>
				<d d_id="101050205">富裕</d>
				<d d_id="101050206">依安</d>
				<d d_id="101050207">拜泉</d>
				<d d_id="101050208">克山</d>
				<d d_id="101050209">克东</d>
				<d d_id="101050210">泰来</d>
			</c>
		<c c_id="0503"><cn>牡丹江</cn>
				<d d_id="101050301">牡丹江</d>
				<d d_id="101050302">海林</d>
				<d d_id="101050303">穆棱</d>
				<d d_id="101050304">林口</d>
				<d d_id="101050305">绥芬河</d>
				<d d_id="101050306">宁安</d>
				<d d_id="101050307">东宁</d>
			</c>
		<c c_id="0504"><cn>佳木斯</cn>
				<d d_id="101050401">佳木斯</d>
				<d d_id="101050402">汤原</d>
				<d d_id="101050403">抚远</d>
				<d d_id="101050404">桦川</d>
				<d d_id="101050405">桦南</d>
				<d d_id="101050406">同江</d>
				<d d_id="101050407">富锦</d>
			</c>
		<c c_id="0505"><cn>绥化</cn>
				<d d_id="101050501">绥化</d>
				<d d_id="101050502">肇东</d>
				<d d_id="101050503">安达</d>
				<d d_id="101050504">海伦</d>
				<d d_id="101050505">明水</d>
				<d d_id="101050506">望奎</d>
				<d d_id="101050507">兰西</d>
				<d d_id="101050508">青冈</d>
				<d d_id="101050509">庆安</d>
				<d d_id="101050510">绥棱</d>
			</c>
		<c c_id="0506"><cn>黑河</cn>
				<d d_id="101050601">黑河</d>
				<d d_id="101050602">嫩江</d>
				<d d_id="101050603">孙吴</d>
				<d d_id="101050604">逊克</d>
				<d d_id="101050605">五大连池</d>
				<d d_id="101050606">北安</d>
			</c>
		<c c_id="0507"><cn>大兴安岭</cn>
				<d d_id="101050701">大兴安岭</d>
				<d d_id="101050702">塔河</d>
				<d d_id="101050703">漠河</d>
				<d d_id="101050704">呼玛</d>
				<d d_id="101050705">呼中</d>
				<d d_id="101050706">新林</d>
				<d d_id="101050708">加格达奇</d>
			</c>
		<c c_id="0508"><cn>伊春</cn>
				<d d_id="101050801">伊春</d>
				<d d_id="101050802">乌伊岭</d>
				<d d_id="101050803">五营</d>
				<d d_id="101050804">铁力</d>
				<d d_id="101050805">嘉荫</d>
			</c>
		<c c_id="0509"><cn>大庆</cn>
				<d d_id="101050901">大庆</d>
				<d d_id="101050902">林甸</d>
				<d d_id="101050903">肇州</d>
				<d d_id="101050904">肇源</d>
				<d d_id="101050905">杜尔伯特</d>
			</c>
		<c c_id="0510"><cn>七台河</cn>
				<d d_id="101051002">七台河</d>
				<d d_id="101051003">勃利</d>
			</c>
		<c c_id="0511"><cn>鸡西</cn>
				<d d_id="101051101">鸡西</d>
				<d d_id="101051102">虎林</d>
				<d d_id="101051103">密山</d>
				<d d_id="101051104">鸡东</d>
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值