一起来开发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,如需转载请自行联系原作者

相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
1天前
|
人工智能 安全 大数据
SDN(软件定义网络)——重塑网络架构的新视角
SDN(软件定义网络)是网络架构革新的关键,通过分离控制与数据平面,实现网络的灵活、高效管理。未来,SDN将更广泛应用于各行业,与云计算、大数据、AI融合,推动数字化转型。开放与标准化的趋势将促进SDN生态发展,提供以业务需求为导向、智能化自动化管理及增强网络安全的新视角。SDN将在更多领域扮演重要角色,支持网络技术的创新与进步。
|
2天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
9天前
|
运维 网络架构
软件体系结构 - 网络拓扑结构
【4月更文挑战第14天】软件体系结构 - 网络拓扑结构
11 0
|
10天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
10 0
|
10天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
10 0
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
21天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
21天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
22 1
Android开发之使用OpenGL实现翻书动画