简介:

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请求参数: 名称类型必填说明 phoneint是需要查询的手机号码或手机号码前7位 keystring是应用APPKEY(应用详细页查询) dtypestring否返回数据的格式,xml或json,默认json调用样例及调试工具:  API测试工具 返回字段: 名称类型说明 error_codeint返回码 reasonstring返回说明 resultstring返回结果集 provincestring省份 citystring城市 areacodestring区号 zipstring邮编 companystring运营商 cardstring卡类型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请求方式的URLprivate static final String URL_GET = "http://apis.juhe.cn/mobile/get?phone=18952201314&key=a53155cc6af64daabc66655b060db56a";//Post请求方式的URLprivate static final String URL_POST = "http://apis.juhe.cn/mobile/get?";//当前查询的手机号码归属地对象private PhoneAttribuion phoneAttribuion = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupViews();initVolleyRequest();}@Overrideprotected void onStop() {//当Activity界面已经停止的时候,取消掉所有的网络请求requestQueue.cancelAll("GET_TAG");requestQueue.cancelAll("POST_TAG");super.onStop();}@Overridepublic 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>() {@Overridepublic 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() {@Overridepublic 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的抽象方法@Overridepublic void onResponse(String arg0) {System.out.println("网络请求成功...");String result = arg0;System.out.println(result);//如果需要将结果封装为PhoneAttribution对象,可参照Get方法中的方式,你也可以将该方式提取为业务方法,在这里调用...}}, new ErrorListener() {//重写ErrorListener的抽象方法@Overridepublic void onErrorResponse(VolleyError arg0) {System.out.println("网络请求失败...");}}){//重写StringRequest的抽象方法@Overrideprotected 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

更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android(安卓)NDK开发(六)——使用开源LAME转码mp3
  3. Android(安卓)HTTP网络通信(一):使用HttpURLConnection、HttpClient
  4. SurfaceView应用浅析
  5. egret 发布微端项目
  6. android中Timer+TimerTask+Handler配合,重复定时执行某项任务(方法
  7. Android(安卓)RxJava/RxAndroid结合Retrofit使用
  8. Android(安卓)View 的工作原理(包含对 DecorView 和 ViewRoot 的
  9. ScrollView 嵌套 RecyclerVeiw, 轻松解决滑动冲突

随机推荐

  1. Android 5.0 如何正确启用isLoggable(一)
  2. Android:注册登录
  3. AutoCompleteTextView的基本使用
  4. MQTT的学习研究(十五) MQTT 和android整合
  5. android 视频播放器的INTENT-FILTER属性
  6. android 实现代码关机
  7. Android(安卓)EditText 设置键盘右下角显
  8. Android之设备ID(Device ID)
  9. Android 经典小技巧总结
  10. eclipse中安装android ADT插件及无法下载