Android之Volley

简介:

Volley是Google I/O 2013上Google官方发布的一款Android平台上的网络通信库。

以前的网络请求,要考虑开启线程、内存泄漏、性能等等复杂的问题。但是Volley框架已经帮我们把这些问题处理好了,对外提供了相应的完善的请求API,我们只需要按照要求使用即可。

特点:

能使网络通信更快,更简单,更健壮

Get、Post网络请求及网络图像的高效率异步处理请求

可以对网络请求进行排序优先级管理

网络请求的缓存

多级别取消请求

和Activity生命周期的联动(Activity结束时同时取消所有网络请求)

使用Volley可以简化一些网络通信的开发,当然Volley不适合大数据(large payloads )和流媒体的网络请求。例如上百兆的文件、视频下载。

Volley开源,可以进行定制修改也可以直接使用Jar包的形式。

用法:

Volley的Get和Post请求方式的使用

Volley的网络请求队列建立和取消队列请求

建立请求首先建立队列,将请求添加到请求队列里。

然后进行相应的Get和Post请求,请求结果在回调里获取解析。

Volley有自己的请求队列管理机制,可以控制每个请求的建立与取消。非常方便和安全。

这样也就可以做到随时控制某个请求在什么时候结束,Activity生命周期关联,防止无谓的请求。

示例:

首先我们需要选择一个网络服务API,这里我选择聚合数据里面的手机归属地查询API,1注册2申请,申请之后会为你的应用分配一个AppKey,下面是API说明:

/**
 *
接口地址:http://apis.juhe.cn/mobile/get
支持格式:JSON/XML
请求方式:GET/POST
请求示例:http://apis.juhe.cn/mobile/get?phone=13429667914&key=您申请的KEY
请求参数:
 	名称	类型	必填	说明
 	phone	int	是	需要查询的手机号码或手机号码前7位
 	key	string	是	应用APPKEY(应用详细页查询)
 	dtype	string	否	返回数据的格式,xml或json,默认json
调用样例及调试工具:
  API测试工具
返回字段:
 	名称	类型	说明
 	error_code	int	返回码
 	reason	string	返回说明
 	result	string	返回结果集
 	province	string	省份
 	city	string	城市
 	areacode	string	区号
 	zip	string	邮编
 	company	string	运营商
 	card	string	卡类型
JSON返回示例:
{
"resultcode":"200",
"reason":"Return Successd!",
"result":{
    "province":"浙江",
    "city":"杭州",
    "areacode":"0571",
    "zip":"310000",
    "company":"中国移动",
    "card":"移动动感地带卡"
}
}
XML返回示例:
  <?xml version="1.0" encoding="utf-8" ?>
- <root>
      <resultcode>200</resultcode>
      <reason>Return Successd!</reason>
    - <result>
          <province>浙江</province>
          <city>杭州</city>
          <areacode>0571</areacode>
          <zip>310000</zip>
          <company>中国移动</company>
          <card>移动动感地带卡</card>
      </result>
  </root>
 *
 */

在使用Volley前,必须将jar包放入工程中去,我这里写了一个示例代码,如下:

public class MainActivity extends Activity implements OnClickListener{

	//声明一个Volley请求队列
	private RequestQueue requestQueue = null;
	//Get请求方式的URL
	private static final String URL_GET = "http://apis.juhe.cn/mobile/get?phone=18952201314&key=a53155cc6af64daabc66655b060db56a";
	//Post请求方式的URL
	private static final String URL_POST = "http://apis.juhe.cn/mobile/get?";
	//当前查询的手机号码归属地对象
	private PhoneAttribuion phoneAttribuion = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setupViews();
		initVolleyRequest();
	}

	@Override
	protected void onStop() {
		//当Activity界面已经停止的时候,取消掉所有的网络请求
		requestQueue.cancelAll("GET_TAG");
		requestQueue.cancelAll("POST_TAG");
		super.onStop();
	}

	@Override
	public void onClick(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.button1:
			//当你点击了Volley Get Request时
			volleyGet();
			break;
		case R.id.button2:
			//当你点击了Volley Post Request时
			volleyPost();
			break;

		default:
			break;
		}

	}

	private void setupViews(){
		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);
	}

	private void initVolleyRequest(){
		//初始化请求队列
		requestQueue = Volley.newRequestQueue(this.getApplicationContext());
	}

	//Get请求方法
	private void volleyGet(){
		//新建一个get请求,请求结果从回调方法onResponse()中获得
		StringRequest stringRequest = new StringRequest(Method.GET, URL_GET, new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				System.out.println("网络请求成功...");
				String result = arg0;

				System.out.println(result);

				//返回结果为json格式,如下格式:
				//{
				//  "resultcode":"200",
				//	"reason":"Return Successd!",
				//	"result":{"province":"江苏","city":"徐州","areacode":"0516","zip":"221000","company":"中国电信","card":"中国电信天翼卡"},
				//	"error_code":0
				//}

				//将结果封装为对象
				try {
					//将结果String转换成Json对象
					JSONObject ret = new JSONObject(result);
					//读取resultcode值
					String resultCode = ret.getString("resultcode").trim();
					if("200".equals(result)){
						//请求结果正常
						JSONObject resultJson = ret.getJSONObject("result");

						//将所有的属性值读取出来
						String province = resultJson.getString("province");
						String city = resultJson.getString("city");
						String areaCode = resultJson.getString("areacode");
						String zip = resultJson.getString("zip");
						String company = resultJson.getString("company");
						String card = resultJson.getString("card");

						//新建一个手机归属地对象,将所有值封装到phoneAttribuion对象中去
						phoneAttribuion = new PhoneAttribuion(province, city, areaCode,
								zip, company, card);

						//至此Get请求结束...

					}else{
						//请求结果异常
						System.out.println("请求结果异常...");
					}
				} catch (Exception e) {
					System.out.println(e);
				}

			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				System.out.println("网络请求失败...");

			}
		});
		//为此get请求设置一个Tag属性
		stringRequest.setTag("GET_TAG");
		//将此get请求加入
		requestQueue.add(stringRequest);
	}

	private void volleyPost(){
		//新建一个post请求,请求结果从回调方法onResponse()中获得
		StringRequest stringRequest = new StringRequest(Method.POST, URL_POST, new Listener<String>() {

			//重写Listener的抽象方法
			@Override
			public void onResponse(String arg0) {
				System.out.println("网络请求成功...");
				String result = arg0;

				System.out.println(result);

				//如果需要将结果封装为PhoneAttribution对象,可参照Get方法中的方式,你也可以将该方式提取为业务方法,在这里调用...

			}
		}, new ErrorListener() {

			//重写ErrorListener的抽象方法
			@Override
			public void onErrorResponse(VolleyError arg0) {
				System.out.println("网络请求失败...");

			}
		}){
			//重写StringRequest的抽象方法
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				Map<String, String> map = new HashMap<String, String>();
				map.put("phone", "18952201314");
				map.put("key", "a53155cc6af64daabc66655b060db56a");
				return map;
			}
		};

		//为此get请求设置一个Tag属性
		stringRequest.setTag("POST_TAG");
		//将此get请求加入
		requestQueue.add(stringRequest);
	}
}

代码中用到了自己定义的一个实体类PhoneAttribution,内容如下:

<span style="font-family:SimSun;font-size:18px;">//手机号码归属地类
public class PhoneAttribuion {

	private String province; //省份
	private String city;	//城市
	private String areaCode; //区号
	private String zip;    //邮编
	private String company;   //运营商
	private String card; //卡套餐类型

	public PhoneAttribuion(String province, String city, String areaCode,
			String zip, String company, String card) {
		super();
		this.province = province;
		this.city = city;
		this.areaCode = areaCode;
		this.zip = zip;
		this.company = company;
		this.card = card;
	}

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getAreaCode() {
		return areaCode;
	}

	public void setAreaCode(String areaCode) {
		this.areaCode = areaCode;
	}

	public String getZip() {
		return zip;
	}

	public void setZip(String zip) {
		this.zip = zip;
	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}

	public String getCard() {
		return card;
	}

	public void setCard(String card) {
		this.card = card;
	}

}</span>

整个工程的代码压缩包如下,需要的可以下载:

Android Volley Demo

时间: 2024-08-11 06:05:50

Android之Volley的相关文章

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)

问题背景:app在上传图片时,同时传递参数,支持传递多个图片.本文中的环境默认已经配好了服务器的CodeIgniter框架.事实上不使用这个框架也是可以的. 一,服务器部分 1,在controllers下的helpers新建文件upload_helper.php <?php /** * Make multifile array input complaint with CI_Upload.<br> * For use files[ ] input name you must use it

Android利用Volley异步加载数据(JSON和图片)完整示例

Android利用Volley异步加载数据(JSON和图片)完整示例 MainActivity.java package cc.testvolley; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v

【Android】Volley做网络请求的几种用法

前言: 最近在将自己写的烂代码重构,以前使用的网络请求全是基于apache的HttpClient,简单使用还好,使用多了发现重复代码太多,而且每次使用都很繁琐,因此在网上找了半天网络请求的相关类库,最后还是确定使用Volley,于是现在记个使用笔记: Volley几个主要功能: 1. 普通String请求: 既然使用了网络请求,那么网络权限是必不可少的,在AndroidManifest.xml中添加: <uses-permission android:name="android.permi

Android之Volley框架源码分析

临近毕业,各种事情各种忙.我也没有认真专注写过博客,最近仔细看了Volley框架的使用及其源码,思前想后,想挑战一下自己,还是写一篇博客来分享,如有错误,欢迎吐槽. Volley简介 网络请求是一个App很重要的一部分,android系统只是提供了一个平台,而android应用则是基于这个平台上进行展示数据,起到与用户进行交互的作用,数据来源于服务端,而二者之间必须通过互联网进行传输数据,在Android系统发布初期,很多开发者都是在Apache协会的Http协议的基础上进行网络请求方法的封装,

Android框架-Volley(一)

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Android

Android框架-Volley(二)

1. ImageRequest的用法 前面我们已经学习过了StringRequest和JsonRequest的用法,并且总结出了它们的用法都是非常类似的,基本就是进行以下三步操作即可: 1. 创建一个RequestQueue对象. 2. 创建一个Request对象. 3. 将Request对象添加到RequestQueue里面. 其中,StringRequest和JsonRequest都是继承自Request的,所以它们的用法才会如此类似.那么不用多说,今天我们要学习的ImageRequest,

Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

一,关于Volley 其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现.但是why? why I have to use Volley?   Before Volley: class HttpURLConnection_post extends Thread{ @Override public void run() { //设置请求的路径 String strUrl="http://api.qingyun