天气预报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~~~~~~~~~