Android 版本的天气预报

package com.wang;         import java.io.InputStream;   import java.io.InputStreamReader;   import java.net.URL;   import java.net.URLEncoder;   import java.util.List;   import java.util.Timer;   import java.util.TimerTask;         import javax.xml.parsers.SAXParser;   import javax.xml.parsers.SAXParserFactory;         import org.xml.sax.InputSource;   import org.xml.sax.XMLReader;         import com.wang.xml.XmlHandler;   import com.wang.xml.weatherSetGet;         import android.R.color;   import android.R.layout;   import android.app.Activity;   import android.app.AlertDialog;   import android.app.Dialog;   import android.graphics.Color;   import android.graphics.drawable.Drawable;   import android.os.Bundle;   import android.os.Handler;   import android.os.Message;   import android.util.Log;   import android.view.Gravity;   import android.view.View;   import android.view.View.OnClickListener;   import android.view.ViewGroup.LayoutParams;   import android.widget.Button;   import android.widget.EditText;   import android.widget.ImageView;   import android.widget.TableLayout;   import android.widget.TableRow;   import android.widget.TextView;         public class WeatherTestDemoActivity extends Activity {             private EditText edcity;       private Button searchBtn;       private Handler weatherHandler;       private Dialog dialog;       private Timer time;                                   public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);           time =new Timer();           edcity=(EditText)findViewById(R.id.editcity);           searchBtn=(Button)findViewById(R.id.buttonsearch);           // 进度对话框,等待资源的下载。。            dialog=new AlertDialog.Builder(this)           .setTitle("读取数据中.....").setMessage("请稍等,正在加载数据...").create();           //这个处理程序的默认构造函数associates的队列为当前线程。如果不是这一个,这个处理程序不能接收消息。            weatherHandler =new Handler(){                     @Override               public void handleMessage(Message msg) {             // 等到从编辑框里输入的城市名称,并赋值个cityname                    final String cityname=edcity.getText().toString();              // 调用seachcityweather进行天气查询                          seachcityweather(cityname);                   //隐藏进度对话框                   dialog.hide();                                                               }                                                                       };          //为按钮添加点击事件           searchBtn.setOnClickListener(new OnClickListener() {                      @Override           public void onClick(View v) {               //显示进度对话框                dialog.show();               //对单个的计划任务执行指定的延时之后。                time.schedule(new TimerTask() {                                      @Override                   public void run() {                       /***                       *定义了一个消息,其中包含一个描述和任意的数据对象,                       *可以发送给一个处理程序。                       *这个对象包含两个额外的int字段和一个额外的对象字段                       *,允许您不分配在许多情况下。  虽然构造函数的信息是公共的,                       *最好的办法就是其中的一个叫Message.obtain()                       *或Handler.obtainMessage()方法,                       *它将把他们从池中回收的对象。                       * ****/                       //声明一个消息对象                        Message msg=new Message();                       //设置消息目标为weatherHandler                        msg.setTarget(weatherHandler);                       msg.sendToTarget();                                          }               }, 100);                          }       });                  }                               protected void seachcityweather(String cityname) {       //SAX解析,SAXParserFactory可以使应用程序配置并获取一个基于SAX的解析器解析来的XML文档            SAXParserFactory factory=SAXParserFactory.newInstance();           try {               /**SAXParser               * 这类包装解析器接口,这个接口是由XMLReader取代。               * 为便于过渡,这类继续支持相同的名称和接口以及支持新方法。               * 这个类的实例可以获得newSAXParser()方法。               * 一旦获取该类的实例,XML可以解析来自各种输入源。               * 这些输入来源是InputStreams、文件、url和SAX InputSources               **/                //实力化SAXParser 得到xml解析的对象getXMLReader                SAXParser sp=factory.newSAXParser();               XMLReader reader=sp.getXMLReader();               //调用XmlHandler 生成一个对象                XmlHandler handler=new XmlHandler();               /**让应用程序可以注册一个事件处理程序的内容。                 * 如果应用程序不注册一个内容处理程序,               * 所有内容事件报道的SAX解析器会悄悄地忽略。                 * 应用程序可以注册一个新的或不同的处理程序在中间的一个解析,               * SAX解析器必须立即开始使用新的处理程序。***/               reader.setContentHandler(handler);               //得到解析的天气的资源+你所需要解析的城市                URL url=new URL("http://www.google.com/ig/api?hl=zh-cn&weather=" + URLEncoder.encode(cityname));               /****               * 读取数据从源输入流���换成字符通过提供的字符转换器。               * 默认的编码是取自“文件。编码”的系统属性。               * InputStreamReader包含一个缓冲区读取的字节数从源流并将其转化成字符需要。               * 缓冲区的大小是8 K               */               //打开输入流                InputStream inputStream=url.openStream();               //转换成国家标准扩展码GBK                InputStreamReader inputStreamReader=new InputStreamReader(inputStream,"GBK");               /****   InputSource               * 这个类允许SAX应用程序封装输入源的信息在一个单独的对象,               * 这可能包括一个公共标识符、系统标识符,字节流(可能有一个指定的编码),和转义字符或字符流。               *               **/               //声明一个对象                InputSource source=new InputSource(inputStreamReader);               /******               * 应用程序可以使用这个方法来指导读者开始的XML解析一个XML文档               * 从任何有效的输入源(一个字符流,字节流,或一个URI)。                 * 应用程序可能无法调用该方法虽然解析过程中               * (他们应该创建一个新的XMLReader相反嵌套的每个XML文档)。               * 一旦一个解析完成,应用程序可以重用相同的XMLReader对象,               * 可能使用不同的输入源               * XMLReader的配置对象(如处理器绑定和价值观的确立对功能的标志和属性)是未受完成解析,               * 除非那方面的定义显式地指定配置的其他行为*******/               reader.parse(source);               //得到天气列表                List<weatherSetGet> weatherlist=handler.getWeatherList();               //实力化表格布局                TableLayout tableLayout=(TableLayout)findViewById(R.id.weathertable);               //删除viewGroup中的子视图                tableLayout.removeAllViews();                              for (weatherSetGet weather:weatherlist) {                                      TableRow  row=new TableRow(this);                   //设置布局参数与此相关的视图。                    //这些供应参数到父的这个视图指定应该如何安排。                    row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));                   //垂直居中                    row.setGravity(Gravity.CENTER_VERTICAL);                                      ImageView imageView=new ImageView(this);                   //下载图片并绘制                    imageView.setImageDrawable(loadImage(weather.getImage()));                   ///z最小高度                    imageView.setMinimumHeight(50);                   row.addView(imageView);                                                         TextView day=new TextView(this);                   // 文本内容和颜色                    day.setText(weather.getDay());                   day.setTextColor(Color.RED);                   day.setGravity(Gravity.CENTER_HORIZONTAL);                   //添加视                    row.addView(day);                                      TextView tv=new TextView(this);                   tv.setText(weather.getLow()+"℃ -  "+weather.getHigh()+"℃ ");                   tv.setTextColor(Color.RED);                 //添加视图                    row.addView(tv);                                      TextView condition=new TextView(this);                  //水平居中                    condition.setGravity(Gravity.CENTER_HORIZONTAL);                   //添加视图                    row.addView(condition);                                      tableLayout.addView(row);                                                                                           }                          } catch (Exception e) {   // 解析错误时候弹出对话框                new AlertDialog.Builder(this)               .setTitle("解析出错啦!!!")               .setMessage("获取天气数据失!!!请重试!!!")           .setNegativeButton("确定"null).show();                                     }       }               //加载天气图片资源              private Drawable loadImage(String image) {       try {           //从输入流InputStream绘图并得到返回其内容的资源是指由该URL。            //默认情况下,返回一个InputStream,或null如果内容类型的响应是未知的            return Drawable.createFromStream((InputStream)new URL("http://www.google.com/"+image).getContent(), "测试...");                  } catch (Exception e) {           Log.e("exception", e.getMessage());       }                                 return null;       }   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/190f526f3015c9364525fadc173c4b74.html