【android】利用Yahoo API完成天气预报


一、 代码展示

1. 文件布局: activity_realize_forecast.xml



    
        
        


2.  天气预报主函数:RealizeForecast.java

package com.realize.andorid.realizeforecast;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class RealizeForecast extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_realize_forecast);
		
        Button submit = (Button) findViewById(R.id.btn);
        submit.setOnClickListener(new OnClickListener() {
        	@Override
            public void onClick(View arg0) {
                try {
                  /* 获取用户输入的城市代号 
                   * 从网址上可以获取对应城市代号:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/
                   */
                   String city = ((EditText) findViewById(R.id.input))
                       .getText().toString();
                	
                    /* 如果用户没有输入,则弹出提示 */ 
                    if (city.equals(""))
                   {
                	Log.d("onClick", "city is null");
                        Toast.makeText(RealizeForecast.this, 
                        "请输入具体的城市代号!", 
                        Toast.LENGTH_LONG).show();
                        return;
                    }
                	   	
                    /*组成URL字符串*/
                    //http://weather.yahooapis.com/forecastrss?w=2162312&u=c
                    String queryString = "http://weather.yahooapis.com/forecastrss?w="
                			+ city + "&u=c";
                    /*将可能的空格替换为"%20"*/
                    URL aURL = new URL(queryString.replace(" ", "%20"));
                	
                    //URL aURL = new URL("http://weather.yahooapis.com/forecastrss?w=2161853&u=c");                   
                    /* 从SAXParserFactory获取SAXParser*/
                    SAXParserFactory spf = SAXParserFactory.newInstance();
                    SAXParser sp = spf.newSAXParser();

                    /* 从SAXParser得到XMLReader*/
                    XMLReader xr = sp.getXMLReader();

                    /*
                     * 创建YahooWeatherHandler,以便解析XML内容
                     */
                    YahooWeatherHandler ywh = new YahooWeatherHandler();
                    xr.setContentHandler(ywh);

                    /* 解析XML文件内容 */
                    xr.parse(new InputSource(aURL.openStream()));

                    /* 当前时间 */
                    TextView tv1 = (TextView)findViewById(R.id.time);
                    tv1.setText("当前时间:" + ywh.getCurrentTime());
                    
                    /* 天气状况 */
                    TextView tv2 = (TextView)findViewById(R.id.weather);
                    tv2.setText("天气状况:" + ywh.getCurrentCondition());
                    
                    /* 温度*/
                    TextView tv3 = (TextView)findViewById(R.id.temp);
                    tv3.setText("目前温度:" + ywh.getCurrentTemp());                    
                     
                    /* 获取图像地址,并显示  */
                    URL iconURL = new URL(ywh.getIconURL());
                    //URL iconURL = new URL("http://l.yimg.com/a/i/us/we/52/34.gif");
                	URLConnection conn = iconURL.openConnection();
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    ImageView iv = (ImageView)findViewById(R.id.iconOfWeather);
                    Bitmap bm = null;
                    bm = BitmapFactory.decodeStream(bis);
                    iv.setImageBitmap(bm);
                    bis.close();
                    is.close();
                    
                    /* 清空输入框的内容 */
                    EditText et = (EditText)findViewById(R.id.input);
                    et.setText("");
               } catch (Exception e) {
                    Log.e("error",e.toString());
               }
        	}//end of onClick
        });//end of SetClick	
	}

}


3. 提取天气信息: YahooWeatherHandler.java

package com.realize.andorid.realizeforecast;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

/**
 * SAXHandler:用户从Yahoo Weather API返回的XML中提取当前天气信息
 */
public class YahooWeatherHandler extends DefaultHandler {    
     private String current_time;     //当前时间
     private String current_condition;//天气状况
     private String iconURL;          //天气图像
     private String current_temp;     //天气温度
     private boolean in_tag = false;  //标识是否解析到“description”
     
     public String getCurrentTime(){
    	 return this.current_time;
     }
     public String getCurrentCondition(){
    	 return this.current_condition;
     }
     public String getIconURL(){
    	 return this.iconURL;
     }
     public String getCurrentTemp(){
    	 return this.current_temp;
     }
     
     public void setCurrentTime(String current_time){
    	this.current_time = current_time;
     }
     public void setCurrentCondition(String condition) {
         this.current_condition = condition;
     }
     public void setIconURL(String iconURL) {
          this.iconURL = iconURL;
     }
     public void setCurrentTemp(String current_temp){
    	this.current_temp = current_temp;
     }
     
     @Override
     public void startDocument() throws SAXException {
   
     }

     @Override
     public void endDocument() throws SAXException {
          
     }

     @Override
     public void startElement(String namespaceURI, String localName,
               String qName, Attributes atts) throws SAXException {
    	 Log.d("weather", localName);
    	 if (localName.equals("condition"))
    	 {
    		 String textAttribute = atts.getValue("text");
    		 this.setCurrentCondition(textAttribute);
    		 
    		 String tempAttribute = atts.getValue("temp");
    		 this.setCurrentTemp(tempAttribute);  
    		 
    		 String dateAttribute = atts.getValue("date");
    		 this.setCurrentTime(dateAttribute);    		 
    	 }
    	 else if(localName.equals("description"))
    	 {
    		 in_tag = true;
    	 }
     }

     @Override
     public void endElement(String namespaceURI, String localName, String qName)
               throws SAXException {
    	 if(localName.equals("description"))
    	 {
    		 in_tag = false;
    	 }   	 

     }

     @Override
     public void characters(char ch[], int start, int length) 
     {
         /** 当遇到如下结构时被调用
          * characters 
          * 
* 提取结果为:http://l.yimg.com/a/i/us/we/52/34.gif */ if(this.in_tag) { String str = new String(ch, start, length); Log.d("characters", str); if (str.startsWith("
"); String s2 = str.substring(10, index2); //从str中提取字符串,从字符串str的第11个字符开始,第index2个字符结束 Log.d("test_img S2", s2); this.setIconURL(s2); } } } }


二、   验证结果

1.  yahoo API 深圳天气: http://weather.yahooapis.com/forecastrss?w=2161853&u=c 

【android】利用Yahoo API完成天气预报_第1张图片

2. 当没有输入城市代号,点击提交

【android】利用Yahoo API完成天气预报_第2张图片

3. 当输入“2161853”,点击提交

【android】利用Yahoo API完成天气预报_第3张图片

附:各个城市代号查询:http://weather.yahoo.com/china/guangdong/shenzhen-2161853/

你可能感兴趣的:(android,android,yahoo,天气预报)