天气预报的学习,主要涉及两个方面,网络数据的获取,以及多线程相关的处理
网络数据的获取:
1 post方式获取网络数据
2 get方式获取数据
线程相关的处理
老版本的sdk允许在主线程中更新界面,但是新版本的sdk为了提高用户体验,要求必须在主线程对界面进行更新,主要涉及两方面的内容:
1 创建一个新的线程
2 利用消息队列将消息发送至主线程,由主线程来处理与界面先关的操作
不多说上代码:
一 get方式获取天气数据
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Xml;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
protected static final int SUCCESS = 1;
protected static final int ERROR = 2;
private EditText et_cityname;
private TextView tv_info;
private String basePath = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=";
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SUCCESS:
List<String> infos = (List<String>) msg.obj;
tv_info.setText("城市名称:"+infos.get(1)+"\n"+
"城市温度:"+infos.get(5)+"\n"+
"天气状况:"+infos.get(6)+"\n"+
"穿衣指数:"+infos.get(11)+"\n"
);
break;
case ERROR:
Toast.makeText(getApplicationContext(), "获取天气信息失败", 0).show();
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_cityname = (EditText) findViewById(R.id.et_cityname);
tv_info = (TextView) findViewById(R.id.tv_info);
}
/**
* 查询按钮的点击事件
* @param view
*/
public void click(View view){
String cityname = et_cityname.getText().toString().trim();
if(TextUtils.isEmpty(cityname)){
Toast.makeText(this, "城市名称不能为空", 0).show();
}else{
//北京
final String path = basePath+URLEncoder.encode(cityname);
new Thread(){
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if(code == 200){
InputStream is = conn.getInputStream();
//创建xml文件的解析器
XmlPullParser parser = Xml.newPullParser();
//初始化xml解析器
parser.setInput(is, "UTF-8");
int type = parser.getEventType();
//集合存放的是所有的天气信息
List<String> infos = new ArrayList<String>();
while(type!=XmlPullParser.END_DOCUMENT){
if(type==XmlPullParser.START_TAG){
if("string".equals(parser.getName())){
String str = parser.nextText();
infos.add(str);
}
}
type = parser.next();//只要没有解析到文档的末尾就不停的向下解析
}
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = infos;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
}
}
}
二 post方式获取天气数据
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Xml;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
protected static final int SUCCESS = 1;
protected static final int ERROR = 2;
private EditText et_cityname;
private TextView tv_info;
//post方式请求服务的路径
private String basePath = "http://www.webxml.com.cn//WebServices/WeatherWS.asmx/getWeather";
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SUCCESS:
List<String> infos = (List<String>) msg.obj;
tv_info.setText("城市名称:"+infos.get(1)+"\n"+
"城市温度:"+infos.get(5)+"\n"+
"天气状况:"+infos.get(6)+"\n"+
"穿衣指数:"+infos.get(11)+"\n"
);
break;
case ERROR:
Toast.makeText(getApplicationContext(), "获取天气信息失败", 0).show();
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_cityname = (EditText) findViewById(R.id.et_cityname);
tv_info = (TextView) findViewById(R.id.tv_info);
}
/**
* 查询按钮的点击事件
* @param view
*/
public void click(View view){
final String cityname = et_cityname.getText().toString().trim();
if(TextUtils.isEmpty(cityname)){
Toast.makeText(this, "城市名称不能为空", 0).show();
}else{
//北京
new Thread(){
public void run() {
try {
URL url = new URL(basePath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//post请求指定请求方式
conn.setRequestMethod("POST");
//请求数据的类型 表单数据
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
String data ="theCityCode="+URLEncoder.encode(cityname)+"&theUserID=";
//指定数据的长度
conn.setRequestProperty("Content-Length", data.length()+"");
//指定运行向服务器写数据。
conn.setDoOutput(true);
conn.setConnectTimeout(5000);
//把客户端的数据以流的方式写个服务器
conn.getOutputStream().write(data.getBytes());
int code = conn.getResponseCode();
if(code == 200){
InputStream is = conn.getInputStream();
//创建xml文件的解析器
XmlPullParser parser = Xml.newPullParser();
//初始化xml解析器
parser.setInput(is, "UTF-8");
int type = parser.getEventType();
//集合存放的是所有的天气信息
List<String> infos = new ArrayList<String>();
while(type!=XmlPullParser.END_DOCUMENT){
if(type==XmlPullParser.START_TAG){
if("string".equals(parser.getName())){
String str = parser.nextText();
infos.add(str);
}
}
type = parser.next();//只要没有解析到文档的末尾就不停的向下解析
}
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = infos;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
}
}
}
最后上传源代码包
不好意思上传不了,如有意向请联系415851641@qq.com,或者直接加企鹅也ok~~~~~~~~~