«

Android之Volley

时间:2024-3-2 17:11     作者:韩俊     分类: Android


简介:

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

标签: android

热门推荐