zoukankan      html  css  js  c++  java
  • 利用json获取天气信息


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

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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="城市名称:" />
    
        <EditText
            android:id="@+id/tx_cityname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" >
        </EditText>
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="最高温度:" />
    
        <EditText
            android:id="@+id/tx_height"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" />
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="最低温度:" />
    
        <EditText
            android:id="@+id/tx_low"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" />
    	 <Button
            android:id="@+id/button_refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="获取实时天气信息" >
        </Button>
    </LinearLayout>
    

         本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天的天气,定位,加入关注城市等功能。网上资源比較多,大家能够多练习练习。



  • 相关阅读:
    [转].net自定义验证控件CustomValidator的使用
    After Effects CS4入门经典—高手之路
    [转]用JS获取地址栏参数的方法(超级简单)
    SpringBoot中通过SpringBootServletInitializer如何实现容器初始化
    SpringBoot之二:部署Spring Boot应用程序方式
    Zookeeper学习(八):Zookeeper的数据发布与订阅模式
    Dubbo各种协议详解
    Annotation之四:注解中的-Xlint:unchecked和 -Xlint:deprecation
    mina在spring中的配置多个端口
    Mina2中IoService
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3927980.html
Copyright © 2011-2022 走看看