Android实现天气查询
来源:互联网 发布:淘宝看不到自己的店铺 编辑:程序博客网 时间:2024/05/21 12:38
这里实现 省份–城市–天气 的联动。即先选择省份,再选择城市,最后展示天气信息。
思路:通过访问:http://www.webxml.com.cn/webservices/weatherwebservice.asmx,通过给定的方式获得所需要的数据,在方法中解析xml成list,然后展示即可。
1:布局与权限:
<uses-permission android:name="android.permission.INTERNET" />
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.inext.test.webview.WeatherActivity"> <Spinner android:id="@+id/pro" android:layout_width="match_parent" android:layout_height="wrap_content"></Spinner> <Spinner android:id="@+id/city" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/pro" android:layout_alignParentStart="true"></Spinner> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/city" android:layout_alignParentStart="true"> <TextView android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/city" android:layout_alignParentStart="true" /> </ScrollView></RelativeLayout>
2:xml解析类,用于解析从站点返回的xml流,返回list:
/** * Created by Administrator on 2016/5/10. * 解析xml工具类 */public class XMLUtil { private InputStream inputStream; public XMLUtil(InputStream inputStream){ this.inputStream = inputStream; } //解析流成list public List getAllElement() throws XmlPullParserException, IOException { List list = null; XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(inputStream,"utf-8"); //事件 int eventType = xpp.getEventType(); String elementName = ""; //当事件不结束时 while (eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ //开始 case XmlPullParser.START_DOCUMENT: list = new ArrayList(); break; //开始一个标签 case XmlPullParser.START_TAG: //获得标签名称 elementName = xpp.getName(); break; //获得标签内容 case XmlPullParser.TEXT: if (elementName.equals("string")){ list.add(xpp.getText()); } break; //标签结束 case XmlPullParser.END_TAG: break; } eventType = xpp.next(); } return list; }}
3:应用类:
public class WeatherActivity extends AppCompatActivity { private List list_city,list_pro,list_data; private Spinner pro,city; private TextView show; private Context context = getBaseContext(); private String cityName,proName,url_city,url_city_data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather); pro = (Spinner)findViewById(R.id.pro); city = (Spinner)findViewById(R.id.city); show = (TextView)findViewById(R.id.show); //获取省份的地址 String url_pro = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportProvince"; //执行获取省份的异步操作 new MyAsync().execute(url_pro); } //获取省份。 城市和天气的获取与解析都是一样的思路 public class MyAsync extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { //调用getXml()方法,(该方法在本类底部位置) list_pro = getXml(params[0]); return list_pro; } @Override protected void onPostExecute(List list) { super.onPostExecute(list); if (list==null || list.size()==0){ return; } Toast.makeText(getBaseContext(),""+list.size(),Toast.LENGTH_SHORT).show(); ArrayAdapter arrayAdapter = new ArrayAdapter(getBaseContext(),android.R.layout.simple_dropdown_item_1line,list_pro); pro.setAdapter(arrayAdapter); pro.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { proName = pro.getSelectedItem().toString().trim(); //Toast.makeText(getBaseContext(),proName,Toast.LENGTH_SHORT).show(); url_city = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportCity?byProvinceName="+proName; new MyAsyncCity().execute(url_city); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } } //获取城市 public class MyAsyncCity extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { list_city = getXml(params[0]); return list_city; } @Override protected void onPostExecute(List list) { super.onPostExecute(list); if (list==null || list.size()==0){ return; } //Toast.makeText(getBaseContext(),""+list.size(),Toast.LENGTH_SHORT).show(); ArrayAdapter arrayAdapter = new ArrayAdapter(getBaseContext(),android.R.layout.simple_dropdown_item_1line,list_city); city.setAdapter(arrayAdapter); arrayAdapter.notifyDataSetChanged(); city.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { cityName = city.getSelectedItem().toString().trim(); cityName = cityName.split(" ")[0]; if (!city.equals("")){ url_city_data = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getWeatherbyCityName?theCityName="+cityName; Toast.makeText(getBaseContext(),cityName,Toast.LENGTH_SHORT).show(); new MyWeather().execute(url_city_data); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } } public class MyWeather extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { list_data = getXml(params[0]); return list_data; } @Override protected void onPostExecute(List list) { super.onPostExecute(list); StringBuilder sb = new StringBuilder(); if (list_data.size()!=0 && list_data!=null){ for (int i=0;i<list_data.size();i++){ String str = list.get(i).toString(); sb.append(str+"\n"); } show.setText(sb.toString()); } } } //getXml方法,解析获得流,并调用XMLUtil类解析流 public List getXml(String urlString){ List list = null; InputStream is = null; HttpURLConnection httpURLConnection = null; try { URL url = new URL(urlString); httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setReadTimeout(5000); if (httpURLConnection.getResponseCode()==200){ //获取返回的数据流 is = httpURLConnection.getInputStream(); //传入Xml解析工具类进行解析 XMLUtil xmlUtil = new XMLUtil(is); try { list = xmlUtil.getAllElement(); } catch (XmlPullParserException e) { e.printStackTrace(); } }else { Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show(); return null; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { if (is!=null){ is.close(); } if (httpURLConnection!=null){ httpURLConnection.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return list; }}
0 0
- Android实现天气查询
- VB实现天气查询
- python实现查询天气
- Android-查询天气
- SpringMVC结合天气api实现天气查询
- Android json解析网络数据实现天气实时查询
- Nodejs 实现天气的查询
- 【Python】实现一个天气查询
- android天气实现
- 调用天气api实现查询各城市天气
- Android解析中国天气接口JSon数据,应用于天气查询!
- “Rimon天气”Android天气查询软件项目总结
- Android 如何实现google天气
- Android天气类app实现
- Ruby实现Google Api天气查询
- 天气预报--查询其他城市天气功能实现
- 用python 实现自主查询实时天气
- android listview实现快速查询A—Z (模拟一些天气搜狐,网易等天气预报)
- String、StringBuffer与StringBuilder之间区别
- java.lang.Exception: Socket bind failed: [730048]
- Delphi berlin 如何自定义Listview外观样式
- Ubuntu16.04 vim 配置自动补全
- 大数据学习网站
- Android实现天气查询
- 在APP已经成魔的当下,桌面软件还有市场吗?
- binary complex的MATLAB读取
- 那些年我使用Volley遇到的坑
- Android 5.1settings源码简要分析
- 生成不重复的数字,但看起来又不是顺序数出来的
- centos 安装 CodeBlocks
- SQL中日期格式的处理to_char函数
- SharedPreference对象的获得