博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用json获取天气信息
阅读量:5813 次
发布时间:2019-06-18

本文共 5289 字,大约阅读时间需要 17 分钟。

       天气预报信息获取是利用json获取的,网上有非常多资源,源码。因为上面涉及到非常多天气信息,包含湿度,出行建议等,以及加入了全部城市代码的资源包。为了练手了解json的原理。我仅获取诚笃城市的最高温,最低温,城市名字。

     我的布局是通过一个button获取城市名字,最高温,最低温。main.xnl代码例如以下

     本project含有2个java文件各自是WheatherLck.java和WheatherInfo.java文件。WheatherLck.java代码例如以下

package com.hiden.weatherdemo;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;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 org.json.JSONException;import org.json.JSONObject;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Intent;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;public class WeatherLck extends Activity {	// 创建三个全局的文本框对象		EditText TX_CITYNAME,TX_HEIGHT,TX_LOW;		private String city_str="成都";		Button button_refresh;				@Override		protected void onCreate(Bundle savedInstanceState) {			// TODO Auto-generated method stub			super.onCreate(savedInstanceState);			setContentView(R.layout.main);						// 获取布局中的文本框			TX_CITYNAME=(EditText)this.findViewById(R.id.tx_cityname);			TX_CITYNAME.setText(city_str);			TX_HEIGHT=(EditText)this.findViewById(R.id.tx_height);			TX_LOW=(EditText)this.findViewById(R.id.tx_low);						button_refresh=(Button)findViewById(R.id.button_refresh);						button_refresh.setOnClickListener(new View.OnClickListener() {								@Override				public void onClick(View v) {					// TODO Auto-generated method stub					if(v==button_refresh){						refresh(city_str);					}									}			});				/**************************************************************************************		 * 获取http://m.weather.com.cn/data/101091106.html上面的数据		 * 当中101091106为城市代码,上面我已经把城市代码做了改动,去除了空行,格式为UTF-8		 * 每次仅仅是执行一次线程,然后增加主线程回收		 * @param city_str		 * @throws JSONException 		 * @throws Exception 		 * @throws ClientProtocolException 		 */		private Thread thread;		private Handler handler = new  Handler(){			@Override			public void handleMessage(Message msg){				switch(msg.what){				case 1:					JSONObject weather = (JSONObject) msg.obj;					refreshUI(weather);					try {						thread.join();					} catch (InterruptedException e) {						// TODO Auto-generated catch block						e.printStackTrace();					}					break;				}			}		};		/************************************************************************		 * 在主线程中不能请求网络		 * 线程没有while循环仅仅是执行一次,假设有溢出可能不能发送消息		 * @param city_str		 */		private void requestWeather(final String city_str){						thread = new Thread(new Runnable(){				@Override				public void run() {					// TODO Auto-generated method stub									String url="http://www.weather.com.cn/data/cityinfo/101270101.html";					HttpClient client = new DefaultHttpClient();					HttpGet httpget = new HttpGet(url);					HttpResponse response;					String sbuf = null;					try {						response = client.execute(httpget);						HttpEntity httpentity = response.getEntity();							if(httpentity != null){							BufferedReader br = new BufferedReader(new InputStreamReader(httpentity.getContent(),"utf-8"));								sbuf = br.readLine();							}							JSONObject object = new JSONObject(sbuf);						JSONObject data = (JSONObject) object.getJSONObject("weatherinfo");						//Log.i(TAG, data.toString());						Message msg = new Message();						msg.what = 1;						msg.obj = data;						handler.sendMessage(msg);											} catch (ClientProtocolException e) {						// TODO Auto-generated catch block						e.printStackTrace();					} catch (IOException e) {						// TODO Auto-generated catch block						e.printStackTrace();					} catch (JSONException e) {						// TODO Auto-generated catch block						e.printStackTrace();					}				}				});			thread.start();					}		protected void refresh(String city_str)		{			requestWeather(city_str);		}		private void refreshUI(JSONObject jsonobject){						JSONObject jsonData = jsonobject;			try			{								TX_CITYNAME.setText(jsonData.getString("city"));				// 取得高温数据				TX_HEIGHT.setText(jsonData.getString("temp1"));				// 取得低温数据				TX_LOW.setText(jsonData.getString("temp2"));						}catch(Exception e){				e.printStackTrace();			}		}	}

     WheatherInfo.java代码例如以下:

package com.hiden.weatherdemo.ui;public class WeatherInfo {	String city = "";	String temp1 = "";	String temp2 = "";// 椋庡悜	public String getCity() {		return city;	}	public void setCity(String city) {		this.city = city;	}	@Override	public String toString() {		return "WeatherInfo [city=" + city + ", temp1=" + temp1				+ ", temp2=" + temp2 + "]";	}		public String getTemp1() {		return temp1;	}	public void setTemp1(String temp) {		this.temp1 = temp;	}		public String getTemp2() {		return temp2;	}	public void setTemp2(String temp) {		this.temp2 = temp;	}}
点击button,获得到成都的最高温度和最低温度,效果图例如以下:

当然,大家能够依据自己的需求做出更具体的效果图,比方加入未来5天的天气,定位,加入关注城市等功能。网上资源比較多,大家能够多练习练习。

你可能感兴趣的文章
Android文件下载之进度检测
查看>>
重构第10天:提取方法(Extract Method)
查看>>
吐血整理 Delphi系列书籍 118本(全)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
“Info.plist” couldn’t be removed
查看>>
Linux创建系统用户
查看>>
多线程day01
查看>>
JSON path
查看>>
Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
查看>>
动画库NineOldAndroids
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
大数据开发实战:Hadoop数据仓库开发实战
查看>>
Spring Boot 2中对于CORS跨域访问的快速支持
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
matlab fread
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
mybatis08
查看>>
01 awk工具的使用
查看>>