Android天气预报开发(2)
在上节我们讲到了Android天气预报开发的数据该怎么获取,在看了上节的具体介绍,我们就知道了要从哪里拿数据,该如何拿数据?当拿到数据后我们就可以进行进一步的开发了。那么在本节我们主要讲到如何使用这些获取到的数据。先看一下我们要实现的最终效果。如下图所示:
根据上一节的介绍,我们最终选定的数据来源是中国中央气象局的天气数据,首先我们来了解一下他返回到的数据代表的意思。
city:西安, // 地区名称
city_en:xian, // 英文 (汉语拼音) 名称
date_y:2012年8月30日, // 当前日期
date:, // 网上解释是阴历年
week:星期四, // 星期
fchh:18, // 更新点时间 (18点)
cityid:101110101, // 地区 ID
// 六天的温度
temp1:21℃~28℃, // 在更新点之前是今日最高温到午夜的最低温,在更新点之后是今日午夜的最低温到明日的最高温
temp2:18℃~22℃, // 以此类推
temp3:17℃~26℃,
temp4:16℃~28℃,
temp5:16℃~29℃,
temp6:17℃~30℃,
// 华氏温度
tempF1:69.8℉~82.4℉,
tempF2:64.4℉~71.6℉,
tempF3:62.6℉~78.8℉,
tempF4:60.8℉~82.4℉,
tempF5:60.8℉~84.2℉,
tempF6:62.6℉~86℉,
// 天气描述,同样根据更新点确定 weather1 是今天还是明天的
weather1:阴转中雨,
weather2:中雨转大雨,
weather3:小到中雨转多云,
weather4:多云转晴,
weather5:晴,
weather6:晴转多云,
// 12 幅图片对应六天的天气,更新点前就是今日白天,今日夜间,明日白天,明日夜间,更新点之后就是今日夜间开始的
img1:2, //阴天
img2:8, // 中雨,和一图片对应天气的阴转中雨
img3:8, // 依次类推
img4:9,
img5:21,
img6:1,
img7:1,
img8:0,
img9:0, // 晴
img10:99, // 第五天是晴,没有 "转" 了,所以这幅图片是无效占位,和前一幅显示相同
img11:0,
img12:1,
img_single:8,
// 分别对应图片的描述
img_title1:阴,
img_title2:中雨,
img_title3:中雨,
img_title4:大雨,
img_title5:小到中雨,
img_title6:多云,
img_title7:多云,
img_title8:晴,
img_title9:晴,
img_title10:晴,
img_title11:晴,
img_title12:多云,
img_title_single:中雨,
// 六天的风力和风向
wind1:西风小于3级转3-4级,
wind2:西风3-4级,
wind3:旋转风小于3级,
wind4:旋转风小于3级,
wind5:旋转风小于3级,
wind6:旋转风小于3级,
// 今明的风向
fx1:西风,
fx2:西风,
// 六天的风力(和风向分开了)
fl1:小于3级转3-4级,
fl2:3-4级,
fl3:小于3级,
fl4:小于3级,
fl5:小于3级,
fl6:小于3级,
// 生活指数,也和更新点有关系
index:热, // 一天舒适度
index_d:天气较热,建议着短裙、短裤、短套装、T恤等夏季服装。年老体弱者宜着长袖衬衫和单裤。, // 一天舒适度的描述
index48:舒适, //两天的舒适度(48小时)
index48_d:建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。, // 描述
index_uv:弱, // 一天的紫外线指数
index48_uv:最弱, // 两天紫外线指数
index_xc:不宜, // 洗车指数
index_tr:一般, // 旅游指数
index_co:较舒适, //舒适度指数
st1:24, // 这些不知道干啥的~应该也是六天的一个什么数据吧。
st2:20,
st3:17,
st4:14,
st5:26,
st6:15,
index_cl:不宜, // 晨练指数
index_ls:不宜, // 晾晒指数
index_ag:极易发 // 息斯敏过敏气象指数
对于实时天气数据的各项具体含义解释如下:
city:西安, // 地区名
cityid:101110101, // 地区 ID
temp1:21℃, // 今天夜间温度
temp2:28℃, // 明天白天温度
weather:阴转中雨, // 天气描述
img1:n2.gif, // 今天夜间天气图片 n 表示 night
img2:d8.gif, // 明天白天天气图片 d 表示 day
ptime:18:00 // 更新时间
注意返回的数据的格式是Json类型。如何解析,我们要用到解析工具通过解析获取所需的信息。由于提供的数据比较多,我们可以选择自己需要的数据,不一定给的数据都要使用到。通过上面介绍我们已经大概了解了这些数据代表的含义。那么我们现在进行Android代码部分的讲解。通过下面的函数我们可以获取到网页数据,其中的String strUrl参数即是网址。
private String connServerForResult(String strUrl) {
//获取HttpGet对象
HttpGet httpRequest = new HttpGet(strUrl);
String strResult = "";
try {
// HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
// 获得HttpResponse对象
HttpResponse httpResponse = httpClient.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 取得返回的数据
strResult = EntityUtils.toString(httpResponse.getEntity());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("Infor", strResult);
return strResult; //返回结果
}
对于返回的结果我们通过Json解析工具进行解析。下面是解析函数的代码,其参数就是要解析的Json格式数据字符串。
private void parseJson(String strResult) {
try {
JSONObject jsonObj = new JSONObject(strResult).getJSONObject("weatherinfo");
today= jsonObj.getString("date_y"); //当前日期
dayofweek= jsonObj.getString("week"); //当前星期
city = jsonObj.getString("city"); //城市名称
ftime= jsonObj.getInt("fchh"); //更新时间(整点)【更新时间确定temp1属于哪天】
……………… //由于数据较多此处省略了部分代码,其他数据解析方法相同,大家可以照葫芦画瓢。
} catch (JSONException e) {
Log.i("Erorr","Json parse error");
e.printStackTrace();
}
}
有了以上两个函数,那么你就可以将数据解析出来。然后送到相应的控间进行显示。当然你也可以保存一下然后再使用。由于页面布局相对复杂一些,这里给一个自己写的完整例子,布局源码:
http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/back1">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/weatherbg"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#2F4F4F"
android:paddingLeft="20dp"
android:layout_gravity="center"
android:textSize="28dp"
android:text="未知"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="25dp"
android:textColor="#FF8C00"
android:textSize="10dp"
android:text=""
/>
android:id="@+id/icon"
android:layout_width="110dp"
android:layout_height="50dp"
android:layout_gravity="center"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:gravity="center"
android:orientation="vertical">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="#E0FFFF"
android:text="时间:2012年12月12日"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:textColor="#E0FFFF"
android:textSize="12dp"
android:text="星期:星期三"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FAFAD2"
android:gravity="bottom"
android:textSize="16dp"
android:text="晴"
/>
android:paddingTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button android:id="@+id/setcity"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/button_place"
/>
<Button android:id="@+id/refresh"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/button_fresh"
/>
</LinearLayout>
<LinearLayout android:id="@+id/clothes"
android:layout_width="wrap_content"
android:layout_below="@id/table"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/clothesicon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/clothes"
android:layout_gravity="top"
/>
<TextView android:id="@+id/clothesvalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF8C00"
android:textSize="12dp"
android:text="穿衣指数"
/>
</LinearLayout>
<TextView android:id="@+id/title"
android:layout_below="@id/clothes"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14dp"
android:textColor="#FF4500"
android:text="生活指数:"
/>
<ListView android:id="@+id/lifevalue"
android:headerDividersEnabled="false"
android:fitsSystemWindows="false"
android:layout_below="@id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ListView>
<android.support.v4.view.ViewPager android:id="@+id/forcast"
android:paddingLeft="20dp"
android:layout_below="@id/lifevalue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:persistentDrawingCache="animation" >
</android.support.v4.view.ViewPager>
</RelativeLayout>
如果你是一个爱学习的人,并耐心的看完了本文的话,希望本文对你有所帮助!由于篇幅有限,完整源码(java代码+xml布局)无法完全贴出,有兴趣研究Android的同学可以通过以下链接下载完整源码(注:由于天气预报只是我设计软件的一项功能。故完整源码只是取出的一个模块,而不能直接单独运行,读者要想使用可自行修改部分,或自建工程然后复制源码!)。
下载地址:http://pan.baidu.com/share/link?shareid=373820&uk=421763582
在上节我们讲到了Android天气预报开发的数据该怎么获取,在看了上节的具体介绍,我们就知道了要从哪里拿数据,该如何拿数据?当拿到数据后我们就可以进行进一步的开发了。那么在本节我们主要讲到如何使用这些获取到的数据。先看一下我们要实现的最终效果。如下图所示:
根据上一节的介绍,我们最终选定的数据来源是中国中央气象局的天气数据,首先我们来了解一下他返回到的数据代表的意思。
city:西安, // 地区名称
city_en:xian, // 英文 (汉语拼音) 名称
date_y:2012年8月30日, // 当前日期
date:, // 网上解释是阴历年
week:星期四, // 星期
fchh:18, // 更新点时间 (18点)
cityid:101110101, // 地区 ID
// 六天的温度
temp1:21℃~28℃, // 在更新点之前是今日最高温到午夜的最低温,在更新点之后是今日午夜的最低温到明日的最高温
temp2:18℃~22℃, // 以此类推
temp3:17℃~26℃,
temp4:16℃~28℃,
temp5:16℃~29℃,
temp6:17℃~30℃,
// 华氏温度
tempF1:69.8℉~82.4℉,
tempF2:64.4℉~71.6℉,
tempF3:62.6℉~78.8℉,
tempF4:60.8℉~82.4℉,
tempF5:60.8℉~84.2℉,
tempF6:62.6℉~86℉,
// 天气描述,同样根据更新点确定 weather1 是今天还是明天的
weather1:阴转中雨,
weather2:中雨转大雨,
weather3:小到中雨转多云,
weather4:多云转晴,
weather5:晴,
weather6:晴转多云,
// 12 幅图片对应六天的天气,更新点前就是今日白天,今日夜间,明日白天,明日夜间,更新点之后就是今日夜间开始的
img1:2, //阴天
img2:8, // 中雨,和一图片对应天气的阴转中雨
img3:8, // 依次类推
img4:9,
img5:21,
img6:1,
img7:1,
img8:0,
img9:0, // 晴
img10:99, // 第五天是晴,没有 "转" 了,所以这幅图片是无效占位,和前一幅显示相同
img11:0,
img12:1,
img_single:8,
// 分别对应图片的描述
img_title1:阴,
img_title2:中雨,
img_title3:中雨,
img_title4:大雨,
img_title5:小到中雨,
img_title6:多云,
img_title7:多云,
img_title8:晴,
img_title9:晴,
img_title10:晴,
img_title11:晴,
img_title12:多云,
img_title_single:中雨,
// 六天的风力和风向
wind1:西风小于3级转3-4级,
wind2:西风3-4级,
wind3:旋转风小于3级,
wind4:旋转风小于3级,
wind5:旋转风小于3级,
wind6:旋转风小于3级,
// 今明的风向
fx1:西风,
fx2:西风,
// 六天的风力(和风向分开了)
fl1:小于3级转3-4级,
fl2:3-4级,
fl3:小于3级,
fl4:小于3级,
fl5:小于3级,
fl6:小于3级,
// 生活指数,也和更新点有关系
index:热, // 一天舒适度
index_d:天气较热,建议着短裙、短裤、短套装、T恤等夏季服装。年老体弱者宜着长袖衬衫和单裤。, // 一天舒适度的描述
index48:舒适, //两天的舒适度(48小时)
index48_d:建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。, // 描述
index_uv:弱, // 一天的紫外线指数
index48_uv:最弱, // 两天紫外线指数
index_xc:不宜, // 洗车指数
index_tr:一般, // 旅游指数
index_co:较舒适, //舒适度指数
st1:24, // 这些不知道干啥的~应该也是六天的一个什么数据吧。
st2:20,
st3:17,
st4:14,
st5:26,
st6:15,
index_cl:不宜, // 晨练指数
index_ls:不宜, // 晾晒指数
index_ag:极易发 // 息斯敏过敏气象指数
对于实时天气数据的各项具体含义解释如下:
city:西安, // 地区名
cityid:101110101, // 地区 ID
temp1:21℃, // 今天夜间温度
temp2:28℃, // 明天白天温度
weather:阴转中雨, // 天气描述
img1:n2.gif, // 今天夜间天气图片 n 表示 night
img2:d8.gif, // 明天白天天气图片 d 表示 day
ptime:18:00 // 更新时间
注意返回的数据的格式是Json类型。如何解析,我们要用到解析工具通过解析获取所需的信息。由于提供的数据比较多,我们可以选择自己需要的数据,不一定给的数据都要使用到。通过上面介绍我们已经大概了解了这些数据代表的含义。那么我们现在进行Android代码部分的讲解。通过下面的函数我们可以获取到网页数据,其中的String strUrl参数即是网址。
private String connServerForResult(String strUrl) {
//获取HttpGet对象
HttpGet httpRequest = new HttpGet(strUrl);
String strResult = "";
try {
// HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
// 获得HttpResponse对象
HttpResponse httpResponse = httpClient.execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 取得返回的数据
strResult = EntityUtils.toString(httpResponse.getEntity());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("Infor", strResult);
return strResult; //返回结果
}
对于返回的结果我们通过Json解析工具进行解析。下面是解析函数的代码,其参数就是要解析的Json格式数据字符串。
private void parseJson(String strResult) {
try {
JSONObject jsonObj = new JSONObject(strResult).getJSONObject("weatherinfo");
today= jsonObj.getString("date_y"); //当前日期
dayofweek= jsonObj.getString("week"); //当前星期
city = jsonObj.getString("city"); //城市名称
ftime= jsonObj.getInt("fchh"); //更新时间(整点)【更新时间确定temp1属于哪天】
……………… //由于数据较多此处省略了部分代码,其他数据解析方法相同,大家可以照葫芦画瓢。
} catch (JSONException e) {
Log.i("Erorr","Json parse error");
e.printStackTrace();
}
}
有了以上两个函数,那么你就可以将数据解析出来。然后送到相应的控间进行显示。当然你也可以保存一下然后再使用。由于页面布局相对复杂一些,这里给一个自己写的完整例子,布局源码:
http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/back1">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/weatherbg"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#2F4F4F"
android:paddingLeft="20dp"
android:layout_gravity="center"
android:textSize="28dp"
android:text="未知"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="25dp"
android:textColor="#FF8C00"
android:textSize="10dp"
android:text=""
/>
android:id="@+id/icon"
android:layout_width="110dp"
android:layout_height="50dp"
android:layout_gravity="center"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:gravity="center"
android:orientation="vertical">
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12dp"
android:textColor="#E0FFFF"
android:text="时间:2012年12月12日"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:textColor="#E0FFFF"
android:textSize="12dp"
android:text="星期:星期三"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FAFAD2"
android:gravity="bottom"
android:textSize="16dp"
android:text="晴"
/>
android:paddingTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button android:id="@+id/setcity"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/button_place"
/>
<Button android:id="@+id/refresh"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/button_fresh"
/>
</LinearLayout>
<LinearLayout android:id="@+id/clothes"
android:layout_width="wrap_content"
android:layout_below="@id/table"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/clothesicon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/clothes"
android:layout_gravity="top"
/>
<TextView android:id="@+id/clothesvalue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF8C00"
android:textSize="12dp"
android:text="穿衣指数"
/>
</LinearLayout>
<TextView android:id="@+id/title"
android:layout_below="@id/clothes"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14dp"
android:textColor="#FF4500"
android:text="生活指数:"
/>
<ListView android:id="@+id/lifevalue"
android:headerDividersEnabled="false"
android:fitsSystemWindows="false"
android:layout_below="@id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ListView>
<android.support.v4.view.ViewPager android:id="@+id/forcast"
android:paddingLeft="20dp"
android:layout_below="@id/lifevalue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:persistentDrawingCache="animation" >
</android.support.v4.view.ViewPager>
</RelativeLayout>
如果你是一个爱学习的人,并耐心的看完了本文的话,希望本文对你有所帮助!由于篇幅有限,完整源码(java代码+xml布局)无法完全贴出,有兴趣研究Android的同学可以通过以下链接下载完整源码(注:由于天气预报只是我设计软件的一项功能。故完整源码只是取出的一个模块,而不能直接单独运行,读者要想使用可自行修改部分,或自建工程然后复制源码!)。
下载地址:http://pan.baidu.com/share/link?shareid=373820&uk=421763582