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