*****************************天气预报的实现****************************
代码:
public class WeatherReport extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weather);
init();
}
private void init(){
Spinner city_spr = (Spinner)findViewById(R.id.Spinner01);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_item, ConstData.city);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
city_spr.setAdapter(adapter);
Button submit = (Button) findViewById(R.id.Button01);
submit.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Spinner spr = (Spinner)findViewById(R.id.Spinner01);
//获得下拉项的索引值
Long l = spr.getSelectedItemId();
int index = l.intValue();
//取出所选城市的坐标
String cityParamString = ConstData.cityCode[index];
try {
URL url = new URL(ConstData.queryString+cityParamString);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
GoogleWeatherHandler gwh = new GoogleWeatherHandler();
xr.setContentHandler(gwh);
InputStreamReader isr =new InputStreamReader(url.openStream(),"GBK");
InputSource is=new InputSource(isr);
xr.parse(is);
WeatherSet ws = gwh.getMyWeatherSet();
updateWeatherInfoView(R.id.weather_0,ws.getMyCurrentCondition());
updateWeatherInfoView(R.id.weather_1,ws.getMyForecastConditions().get(0));
updateWeatherInfoView(R.id.weather_2,ws.getMyForecastConditions().get(1));
updateWeatherInfoView(R.id.weather_3,ws.getMyForecastConditions().get(2));
updateWeatherInfoView(R.id.weather_4,ws.getMyForecastConditions().get(3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private void updateWeatherInfoView(int aResourceID,WeatherCurrentCondition aWCC) throws MalformedURLException {
URL imgURL = new URL("http://www.google.com/" + aWCC.getIcon());
((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherIcon(imgURL);
((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherString(aWCC.toString());
}
private void updateWeatherInfoView(int aResourceID,WeatherForecastCondition aWFC) throws MalformedURLException {
URL imgURL = new URL("http://www.google.com/" + aWFC.getIcon());
((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherIcon(imgURL);
((SingleWeatherInfoView) findViewById(aResourceID)).setWeatherString(aWFC.toString());
}
}
************************xml 的sax解析代码***************************
public class GoogleWeatherHandler extends DefaultHandler {
private WeatherSet myWeatherSet = null;
private boolean is_Current_Conditions = false;
private boolean is_Forecast_Conditions = false;
// private final String FORECAST_INFORMATION="forecast_information";
private final String CURRENT_CONDITIONS="current_conditions";
private final String FORECAST_CONDITIONS="forecast_conditions";
public GoogleWeatherHandler(){
}
public WeatherSet getMyWeatherSet() {
Log.i("igwh", " getMyWeatherSet");
return myWeatherSet;
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(localName.equals(CURRENT_CONDITIONS)){
this.is_Current_Conditions = false;
}else if(localName.equals(FORECAST_CONDITIONS)){
this.is_Forecast_Conditions = false;
}
}
@Override
public void startDocument() throws SAXException {
this.myWeatherSet = new WeatherSet();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if(localName.equals(CURRENT_CONDITIONS)){
Log.i("localName+CURRENT", localName);
this.myWeatherSet.setMyCurrentCondition(new WeatherCurrentCondition());
Log.i("localName+CURRENT+1", localName);
this.is_Current_Conditions = true;
}else if(localName.equals(FORECAST_CONDITIONS)){
this.myWeatherSet.getMyForecastConditions().add(new WeatherForecastCondition());
this.is_Forecast_Conditions = true;
}else{
if(localName.equals(CURRENT_CONDITIONS)){
Log.i("localName+CURRENT", localName);
}
String dataAttribute = attributes.getValue("data");
//Shared Tags
if(localName.equals("icon")){
if(this.is_Current_Conditions){
this.myWeatherSet.getMyCurrentCondition().setIcon(dataAttribute);
}else if(this.is_Forecast_Conditions){
this.myWeatherSet.getLastForecastCondition().setIcon(dataAttribute);
}
}else if(localName.equals("condition")){
if(this.is_Current_Conditions){
this.myWeatherSet.getMyCurrentCondition().setCondition(dataAttribute);
}else if(this.is_Forecast_Conditions){
this.myWeatherSet.getLastForecastCondition().setCondition(dataAttribute);
}
}//Tags is current_conditions
else if(localName.equals("temp_c")){
this.myWeatherSet.getMyCurrentCondition().setTemp_celcius(dataAttribute);
}else if(localName.equals("humidity")){
this.myWeatherSet.getMyCurrentCondition().setHumidity(dataAttribute);
}else if(localName.equals("wind_condition")){
this.myWeatherSet.getMyCurrentCondition().setWind_condition(dataAttribute);
}//Tags is forecast_conditions
else if(localName.equals("day_of_week")){
this.myWeatherSet.getLastForecastCondition().setDay_of_week(dataAttribute);
}else if(localName.equals("low")){
this.myWeatherSet.getLastForecastCondition().setLow(dataAttribute);
}else if(localName.equals("high")){
this.myWeatherSet.getLastForecastCondition().setHigh(dataAttribute);
}
}
}
@Override
public void characters(char ch[], int start, int length) {
/*
* Would be called on the following structure: <element>characters</element>
*/
}
}
************************界面的xml代码实现******************************
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg">
<TableLayout
android:id="@+id/TableLayout02"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/TableRow01"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg"
android:textStyle="bold"
android:textSize="16px"
android:layout_marginLeft="10px"
android:textColor="@color/black">
</TextView>
<Spinner
android:id="@+id/Spinner01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingLeft="10px"
android:minWidth="200px">
</Spinner>
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/OK"
android:paddingLeft="10px">
</Button>
</TableRow>
</TableLayout>
<TableLayout
android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableRow
android:id="@+id/TableRow02"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow03"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow04"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow05"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow
android:id="@+id/TableRow06"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.dudo.weather.views.SingleWeatherInfoView
android:id="@+id/weather_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</TableRow>
</TableLayout>
</LinearLayout>
**********************************************************
在界面的xml代码中有com.dudo.weather.views.SingleWeatherInfoView,该实现方式为代码实现,定义了当天与未来几天的天气显示布局,代码如下:
public class SingleWeatherInfoView extends LinearLayout{
private ImageView myWeatherImageView = null;
private TextView myTempTextView = null;
public SingleWeatherInfoView(Context context){
super(context);
}
public SingleWeatherInfoView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.myWeatherImageView = new ImageView(context);
this.myWeatherImageView.setPadding(10, 5, 5, 5);
this.myTempTextView = new TextView(context);
this.myTempTextView.setTextColor(Color.GREEN);
this.myTempTextView.setTextSize(16);
this.addView(this.myWeatherImageView, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
this.addView(this.myTempTextView, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
public void setWeatherString(String aWeatherString) {
this.myTempTextView.setText(aWeatherString);
}
public void setWeatherIcon(URL aURL) {
try{
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
this.myWeatherImageView.setImageBitmap(bm);
}catch(Exception e){
}
}
}
分享到:
相关推荐
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式处理XML文档,相较于DOM(Document Object Model)解析器,SAX解析更加轻量级和高效。 SAX解析的核心思想是读取XML文档时,每当遇到一个元素、...
java xmlSAX 解析,简单易使用。
相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用事件驱动的方式逐个处理XML元素。在本项目中,"saxloadxml"应该是实现了一个SAX...
SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
SAX解析的基本原理是,当解析器读取XML文档时,遇到每个元素、属性或其他XML结构,都会触发一个特定的事件,开发者可以通过实现SAX解析器的事件接口来响应这些事件。这种方式对比DOM解析(将整个XML文档加载到内存中...
本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...
SAX解析器的工作原理是基于事件驱动的,它在解析XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者通过实现SAX解析器的回调接口(如ContentHandler),在这些事件发生时执行相应的...
本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析器的使用,并且提到了使用JDOM和JOM4J这两个Java库来处理XML。 1. **DOM解析**:DOM是一种树型结构,它将整个XML文档加载到内存中...
SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到XML文档中的特定事件(如开始元素、结束元素、字符数据等)时,会触发相应的回调函数。这种解析方式适用于处理大型...
本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...
SAX解析的基本工作原理是通过事件处理器(如ContentHandler、EntityResolver等)来接收XML文档的解析事件,如开始文档、结束文档、开始元素、结束元素、字符数据等。当解析器遇到这些事件时,会调用相应的处理器方法...
本文将深入探讨如何使用SAX解析XML并获取元素的值或内容。 首先,SAX解析器以流式方式读取XML文档,当遇到文档的不同部分时,会触发相应的事件,如开始文档、开始元素、结束元素等。开发者可以注册事件处理器来响应...
标题中提到的"XML通过SAX解析为JSON格式"是指使用SAX解析器来读取XML文档,并将其转换成等效的JSON对象。SAX解析器以流式方式处理XML,当遇到文档的不同部分(如开始标签、结束标签、文本节点等)时,会触发相应的...
SAX解析器逐行读取XML文件,只在需要时处理数据,显著降低了内存需求。 SAX解析的核心在于事件驱动模型。当解析器读取XML文件时,遇到开始元素、结束元素、字符数据等,它会触发相应的事件,并调用预先注册的处理器...
相比之下,SAX解析采用了事件驱动的方式,它不是将整个XML文档加载到内存中,而是逐行扫描XML文件,遇到元素开始、结束、属性等事件时触发相应的回调函数。例如,对于上述XML,SAX解析器会依次调用startElement、...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络获取的XML文件。 1. **XML与SAX解析基础** - XML是一种结构化的文本数据表示方式,它定义了标签、属性等规则,使数据具有自解释性。 - SAX解析器...