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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。