简介:
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