一起来开发Android的天气软件(三)——使用Volley实现网络通信

简介:

   距离上一篇一起来开发Android天气软件二的时间又将近半个月了,之间一直由于有事而没有更新实在抱歉,近期会加快更新的步伐。争取在2015年到来前写完这系列的博文,上一章我们已经使用LitePal框架搭建好了我们所需的数据库。这一章的内容将主要完毕关于从中国天气网获取数据的网络通信操作,之前有学习过Android开发的同学应该都知道,Android实现互联网通信主要有两种方法,一种使用HTTPURLCONNECTION,一种使用HttpClient的方式,而我们今天将使用不同于以上两种的方式,使用Volley框架完毕我们的网络通信服务。   

   Volley框架呢是 2013年在Google I/O大会上推出了一个新的网络通信框架。Volley非常的简单易用。在通信性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,也比較适合我们这款软件吧。

一、怎样获取数据

   怎样获取全国全部省份的信息呢。我们仅仅要要訪问下面网址 http://www.weather.com.cn/data/list3/city.xml,就会返回中国全部省份的名称和代号,例如以下所看到的。

01|北京,02|上海,03|天津,21|浙江等等,我们能够看到城市与其代号之间通过|号相隔开,省份与省份之间用。号隔开,记住这个结构。

之后的之后会用到正則表達式去截取。

   怎样查看浙江省下的城市的信息呢,事实上也非常easy,仅仅须要訪问下面网址http://www.weather.com.cn/data/list3/city21.xml,也就是仅仅须要将省级代号加入至city后面就能够了。server就会返回数据2101|杭州,2102|宁波。2103|温州等等。
   相同的方法,我们假设想訪问杭州下面的县市的信息,仅仅须要city加入2101就可以。例如以下示               http://www.weather.com.cn/data/list3/city2101.xml。

   以上我们就能够知道怎样获得全国省市区的信息了。那么怎样得到某详细城市的天气呢?以杭州市区为例他的县级代号为210101,那么訪问下面网址http://www.weather.com.cn/data/list3/city210101.xml就会返回一个非常easy的数据210101|101210101,后面的就是杭州市区所相应的天气代号,之后我们在用我们这个得到的代号就能够訪问下面网址http://www.weather.com.cn/data/cityinfo/101210101.html,注意这个网址后缀是html,不是xml了。写代码的时候不要写错了。这样server就会把杭州市区的天气信息已json格式的数据返回给我们,例如以下所看到的。
      {"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}}

二、怎样实现网络通信

    我们如今已经知道訪问的网址的详细地址了。那么怎样通过我们的软件实现真正的网络通信呢。接下来我将先以使用HTTPURLCONNCTION方法实现网络的数据获取,详细的代码例如以下所看到的。

   

package com.melhc.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtil {
	/*
	 * 从server端获取省县市的数据
	 */
	public static void sendHttpRequest(final String address,
			final HttpCallbackListener listener) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				HttpURLConnection connection = null;
				try {
					//创建一个url对象
					URL url = new URL(address);
					//通过url对象获取HTTPURLCONNCETION实例
					connection = (HttpURLConnection) url.openConnection();
					//设置http的请求所使用的方法为get方法
					connection.setRequestMethod("GET");
					//自由定制一些属性。比方设置连接超时,读取超时的毫秒数
					connection.setConnectTimeout(8000);
					connection.setReadTimeout(8000);
					//获得server返回的输入流
					InputStream in = connection.getInputStream();
					//将得到的输入流装换成String字符串
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(in, "utf-8"));
					StringBuffer response = new StringBuffer();
					String line;
					while ((line = reader.readLine()) != null) {
						response.append(line);
					}
					LogUtil.i("HTTPUtil",
							"------------------>" + response.toString());
					if (listener != null) {
						listener.onFinish(response.toString());
					}
				} catch (Exception e) {
					// TODO: handle exception
					if (listener != null) {
						listener.onError(e);
					}
				} finally {
					if (connection != null) {
						connection.disconnect();
					}
				}
			}
		}).start();
	}
}

    上面的代码应该还是比較简单易懂的。由于网络通信操作是一个耗时操作,所以不能在主线程中使用。所以我们新开了一个子线程来获取数据!

细心的朋友会发现上面的传入參数除了目标的訪问网址。还传入了一个HttpCallBackListener对象。这个是干嘛用的呢?这里是用了一个回调机制,由于子线程是不同意有return对象的。而我们返回的数据可能又要运用到还有一个类中的方法中使用。那么怎样将该数据在两个类中传递呢。那么就会运用到回调机制。

    先创立一个HttpCallBackListener接口
package com.melhc.util;

/*
 *  网路连接的回掉接口
 */
public interface HttpCallbackListener {
	void onFinish(String response);

	void onError(Exception e);
}

    然后接该方法作为參数传入我们的网络通信类中,事实上他的实现方法跟我们Android经常使用的onCLickListener的实现原来一样,然后这个接口的详细实如今使用该类的地方实化。从而获取网络通信中得到的数据,该接口事实上就成为了连接两个类中的桥梁。
HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {

			@Override
			public void onFinish(String response) {
				// TODO Auto-generated method stub
				boolean result = false;
				if ("province".equals(type)) {
					result = Utility
							.handleProvicesResponse(weatherDB, response);
				} else if ("city".equals(type)) {
					result = Utility.handleCitiesResponse(weatherDB, response,
							selectedProvince);
				} else if ("county".equals(type)) {
					result = Utility.handleCountiesResponse(weatherDB,
							response, selectedCity);
				}

    这个就是详细实现类中的使用,这个类之后我们后面的博文中详细介绍,在此我们仅仅要注意在主线程中我们才实例化了这个HttpCallBackListener接口,通过response參数的传递继续完毕接下来的方法。
   传统的网络通信方法到此呢就讲完了,是不是认为还是挺麻烦的。还得使用什么回调机制,在Volley中可都不须要了。人家都帮我们封装好了。

三、Volley实现网络通信

    接下来我们就開始正式使用Volley完毕上面一摸一样的通信流程,仅仅须要三步就可以完毕网络的发送与响应!首先还是得先下载一下Volley的jar文件。而且导入自己的程序中!volley.jar下载地址:http://download.csdn.net/detail/u013900875/8279223。接下来按下面三步走就可以!

          1. 创建一个RequestQueue对象。

          2. 创建一个StringRequest对象。

          3. 将StringRequest对象加入到RequestQueue里面。

          详细的代码实现例如以下所看到的

RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
		StringRequest stringRequest = new StringRequest(address,
				new Response.Listener<String>() {
					@Override
					public void onResponse(String response) {
						LogUtil.i("TAG", "---------------->"+response);
						boolean result = false;
						if ("province".equals(type)) {
							result = Utility.handleProvicesResponse(weatherDB,
									response);
						} else if ("city".equals(type)) {
							result = Utility.handleCitiesResponse(weatherDB,
									response, selectedProvince);
						} else if ("county".equals(type)) {
							result = Utility.handleCountiesResponse(weatherDB,
									response, selectedCity);
						}
						if (result) {
							// 通过runonUiMainThread方法返回主线程处理逻辑
							runOnUiThread(new Runnable() {
								@Override
								public void run() {
									// TODO Auto-generated method stub
									closeProgressDialog();
									if ("province".equals(type)) {
										queryProvinces();
									} else if ("city".equals(type)) {
										queryCities();
									} else if ("county".equals(type)) {
										queryCounties();
									}
								}
							});
						}
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {
						LogUtil.i("TAG", "-------------------->" + error);
						runOnUiThread(new Runnable() {
							@Override
							public void run() { // TODO Auto-generated method
												// stub //
								closeProgressDialog();
								Toast.makeText(getApplicationContext(),
										"载入数据失败。", Toast.LENGTH_SHORT).show();
							}
						});
					}
				});
		mQueue.add(stringRequest);

    我们能够发现volley框架真的简单了非常多,不须要我们去设置一些HTTP的通信属性以及一些回调方法。让我们仅仅用去关心怎样处理返回的数据就可以。那么下面我们来逐条解析一下volley三步操作的每一步。
 RequestQueue mQueue = Volley.newRequestQueue(context); 
    第一步首先须要获取到一个RequestQueue对象。注意这里拿到的RequestQueue是一个请求队列对象,它能够缓存全部的HTTP请求,然后依照一定的算法并发地发出这些请求。    
 StringRequest stringRequest = new StringRequest(address,  
                        new Response.Listener<String>() {  
                            @Override  
                            public void onResponse(String response) {  
                                Log.d("TAG", response);  
                            }  
                        }, new Response.ErrorListener() {  
                            @Override  
                            public void onErrorResponse(VolleyError error) {  
                                Log.e("TAG", error.getMessage(), error);  
                            }  
                        });  
    第二步发送http请求。当中要传入三个參数,第一个就是訪问的目标站点的网址,第二个是成功回调得到数据后的方法。第三个是失败回调得到数据的方法,是不是非常easy。省去了我们创建接口的过程。

    mQueue.add(stringRequest); 
    最后。将这个StringRequest对象加入到RequestQueue里面就能够了,大功完毕! 好的。这一节课的内容就说到这里,也希望大家能继续支持该系列的博文。你们的支持是我写下去的最大动力!今天的网络通信的内容就到此结束, 下一篇博文一起来开发Android的天气软件(四)——使用Gson解析数据
      下面是该应用的Git开源地址,https://github.com/melhc/SimpleWeather

       2014博客之星请支持一下啊!http://vote.blog.csdn.net/blogstar2014/details?username=u013900875#content






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5143980.html,如需转载请自行联系原作者

相关文章
|
28天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
52 11
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
27天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
51 11
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
57 19
|
25天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
41 4
|
2月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
65 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
38 5
|
1月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
121 3