您的位置:首页 > 移动开发 > Android开发

Android之Volley

2015-05-18 15:48 85 查看
原文地址:http://blog.csdn.net/bear_huangzhen/article/details/45786955

简介:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: