android的google天气显示,包括读取网络信息,读取xml,使用网络信息二级制码生成文件


1.生成url
2.获取google返回的网络信息 new InputSource(aURL.openStream())
3.生成解析xml的处理器
4.解析xml
5.封装解析后的xml文件
6.根据解析后的数据,生成url,获取google返回的天气图标,赋值给图片

代码:

/*获取用户输入的城市名称*/ 

 String city = ((EditText) findViewById(R.id.input)) 

 .getText().toString(); 


 /*组成URL字符串*/ 

 //中文:http://www.google.com/ig/api?hl=zh-cn&weather= 

 //英文:http://www.google.com/ig/api?weather= 

 String queryString = "http://www.google.com/ig/api?weather=" 

 + city; 

 /*将可能的空格替换为"%20"*/ 

 URL aURL = new URL(queryString.replace(" ", "%20")); 


 /* 从SAXParserFactory获取SAXParser*/ 

 SAXParserFactory spf = SAXParserFactory.newInstance(); 

 SAXParser sp = spf.newSAXParser(); 


 /* 从SAXParser得到XMLReader*/ 

 XMLReader xr = sp.getXMLReader(); 


 /* 

 * 创建GoogleWeatherHandler,以便解析XML内容 

 */ 

 GoogleWeatherHandler gwh = new GoogleWeatherHandler(); 

 xr.setContentHandler(gwh); 


 /* 解析XML文件内容 */ 

 xr.parse(new InputSource(aURL.openStream()) ); 



 TextView tv1 = (TextView)findViewById(R.id.tem); 

 tv1.setText("温度:" + gwh.getCurrentTemp() + "摄氏度"); 


 TextView tv2 = (TextView)findViewById(R.id.weather); 

 tv2.setText(gwh.getCurrentCondition()); 


 TextView tv3 = (TextView)findViewById(R.id.hum); 

 tv3.setText(""+ gwh.getCurrentHum() ); 



 URL iconURL = new URL("http://www.google.com"+ gwh.getIconURL()); 

 URLConnection conn = iconURL.openConnection(); 

 conn.connect(); 

 InputStream is = conn.getInputStream(); 

 BufferedInputStream bis = new BufferedInputStream(is); 

 //设置icon 

 ImageView iv = (ImageView)findViewById(R.id.iconOfWeather); 

 Bitmap bm = null; 

 bm = BitmapFactory.decodeStream(bis); 

 iv.setImageBitmap(bm); 

 bis.close(); 

 is.close(); 



分析google返回的xml的处理类代码: 

 private boolean in_current_conditions = false; 

 private boolean in_forecast_conditions = false; 


 private Integer current_temp; 

 private String current_condition; 

 private String current_hum; 

 private String iconURL; 



 @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 { 

 // 'Outer' Tags 

 if (localName.equals("forecast_information")) { 

 this.in_forecast_information = true; 

 } else if (localName.equals("current_conditions")) { 

 this.in_current_conditions = true; 

 } else if (localName.equals("forecast_conditions")) { 

 this.in_forecast_conditions = true; 

 } else { 

 String dataAttribute = atts.getValue("data"); 

 // 'Inner' Tags of "<forecast_information>" 

 if (localName.equals("city")) { 

 } else if (localName.equals("postal_code")) { 

 } else if (localName.equals("latitude_e6")) { 

 /* One could use this to convert city-name to Lat/Long. */ 

 } else if (localName.equals("longitude_e6")) { 

 /* One could use this to convert city-name to Lat/Long. */ 

 } else if (localName.equals("forecast_date")) { 

 } else if (localName.equals("current_date_time")) { 

 } else if (localName.equals("unit_system")) { 

 if (dataAttribute.equals("SI")) 

 this.usingSITemperature = true; 

 } 

 // SHARED(!) 'Inner' Tags within "<current_conditions>" AND 

 // "<forecast_conditions>" 

 else if (localName.equals("day_of_week")) { 

 if (this.in_current_conditions) { 

 //可扩展 

 } else if (this.in_forecast_conditions) { 

 //可扩展 

 } 

 } else if (localName.equals("icon")) { 

 if (this.in_current_conditions) { 

 this.setIconURL(dataAttribute); 

 } else if (this.in_forecast_conditions) { 

 //可扩展 

 } 

 } else if (localName.equals("condition")) { 

 if (this.in_current_conditions) { 

 this.setCurrentCondition(dataAttribute); 

 } else if (this.in_forecast_conditions) { 

 //可扩展 

 } 

 } 

 // 'Inner' Tags within "<current_conditions>" 

 else if (localName.equals("temp_f")) { 

 //this.setCurrentTemp(Integer.parseInt(dataAttribute)); 

 } else if (localName.equals("temp_c")) { 

 this.setCurrentTemp(Integer.parseInt(dataAttribute)); 

 } else if (localName.equals("humidity")) { 

 this.setCurrentHum(dataAttribute); 

 } else if (localName.equals("wind_condition")) { 

 //可扩展 

 } 

 // 'Inner' Tags within "<forecast_conditions>" 

 else if (localName.equals("low")) { 

 int temp = Integer.parseInt(dataAttribute); 

 if (this.usingSITemperature) { 

 //可扩展 

 } else { 

 //可扩展 

 } 

 } else if (localName.equals("high")) { 

 //int temp = Integer.parseInt(dataAttribute); 

 if (this.usingSITemperature) { 

 //可扩展 

 } else { 

 //可扩展 

 } 

 } 

 } 

 } 


 @Override 

 public void endElement(String namespaceURI, String localName, String qName) 

 throws SAXException { 

 if (localName.equals("forecast_information")) { 

 this.in_forecast_information = false; 

 } else if (localName.equals("current_conditions")) { 

 this.in_current_conditions = false; 

 } else if (localName.equals("forecast_conditions")) { 

 this.in_forecast_conditions = false; 

 } 

 } 


 @Override 

 public void characters(char ch[], int start, int length) { 

 /* 

 * 可扩展 <element>characters</element> 

 */ 

 }