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; } }
Android 版本的天气预报
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:http://www.heiqu.com/190f526f3015c9364525fadc173c4b74.html