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;
}
}