天气预报app学习

天气预报的学习,主要涉及两个方面,网络数据的获取,以及多线程相关的处理

网络数据的获取:

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~~~~~~~~~

posted @ 2014-10-16 21:26  jiefeiduan  阅读(258)  评论(0编辑  收藏  举报