大家好,今天我们讲一下如何使用Volley框架请求网络,为何要使用Volley框架,这就要先说一下使用Volley框架请求网络的优点了,volley是易于定制的,即你可以根据需求来设定volley框架,还有volley框架支持请求的优先级设定,即你可以自主设定网络请求的优先级,还有就是volley框架请求支持取消单个或多个请求,这个一会设置请求的时候会特别说明,还有它可以自动调度网络请求,至于其他的如代码的健壮性、支持多并发等等就不一一列举了,说了那么多下面就介绍如何自定义并使用Volley框架:
第一步:定义netrequest类继承StringRequest类
1、在这个类里首先要自定义三个全局变量,
1 private Priority priority; 2 private Map<String,String> headers ; 3 private Map<String,String> params; 4 5 /** 6 * 初始化全局变量 7 */ 8 private void init(){ 9 priority = Priority.NORMAL; 10 headers = new HashMap<>(); 11 params = new HashMap<>(); 12 }
2、实现两个有参构造,在这两个构造方法中并不需要再多些什么,只要初始化自定义的三个全局变量。
1 public NetRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) { 2 super(method, url, listener, errorListener); 3 init(); 4 } 5 6 public NetRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) { 7 super(url, listener, errorListener); 8 init(); 9 }
3、重写设置优先级的方法
1 //设置优先级 2 @Override 3 public Priority getPriority() { 4 return priority; 5 }
4、重写为请求添加请求头信息的方法
1 //为请求添加头信息的方法 2 @Override 3 public Map<String, String> getHeaders() throws AuthFailureError { 4 return headers; 5 } 6 7 @Override 8 public Map<String, String> getParams()throws AuthFailureError{ 9 return params; 10 } 11 12 public NetRequest setPriority(Priority priority){ 13 this.priority = priority; 14 return this; 15 } 16 17 public NetRequest addRequestHeader(String key,String value){ 18 this.headers.put(key,value); 19 return this; 20 } 21 22 public NetRequest addParams(String key,String value){ 23 this.params.put(key, value); 24 return this; 25 }
5、自定义一个发送请求的方法,其中VolleyUtil类为一个工具类,是自己定义的下一步就是定义它
1 /** 2 * 发送请求 3 */ 4 public void start(){ 5 VolleyUtil.start(this); 6 }
6、自定义一个静态类Builder为网络请求传参,这也被称作构造者模式
1 //构造者模式 2 public static class Builder{ 3 4 private String url; 5 private int method; 6 private CallBack callBack; 7 8 public Builder setCallBack(CallBack callBack){ 9 this.callBack = callBack; 10 return this; 11 } 12 public Builder setUrl(String url){ 13 this.url = url; 14 return this; 15 } 16 public Builder setMethod(int method){ 17 this.method = method; 18 return this; 19 }
20 }
7、自定义一个buileder方法请求网络返回NetRequest(这一步比较关键)
1 /** 2 * 创建一个NetRequest请求网络 3 * @return NetRequest 4 */ 5 public NetRequest build(){ 6 NetRequest nr = new NetRequest( 7 method, 8 url, 9 new Response.Listener<String>() { 10 @Override 11 public void onResponse(String response) { 12 if (callBack!=null){ 13 callBack.onSuccess(response); 14 } 15 } 16 }, 17 new Response.ErrorListener() { 18 @Override 19 public void onErrorResponse(VolleyError error) { 20 if (callBack!=null){ 21 callBack.onError(error); 22 } 23 } 24 }); 25 return nr; 26 }
8、定义一个接口Callback包含两个抽象方法来实现请求网络四个参数的后两个(因为网络请求是一个异步的操作,所以请求的时候需要自定义一个类实现这个借口并重写接口中的这两个方法)
1 import com.android.volley.VolleyError; 2 3 /** 4 * Created by zhangdi on 2016/8/8. 5 */ 6 public interface CallBack { 7 public void onSuccess(String respone); 8 public void onError(VolleyError error); 9 }
第二步:自定义一个工具类(就是第一步中start方法中的那个工具类,里面的方法都设置成静态的方便调用,这也是工厂模式的一种)
1、首先要初始化请求队列
1 private static RequestQueue requestQueue; 2 /** 3 * 初始化请求队列 4 * @param mContext 5 */ 6 public static void init(Context mContext){ 7 if (requestQueue==null){ 8 requestQueue = Volley.newRequestQueue(mContext); 9 } 10 }
2、设置get请求方法
1 /** 2 * get请求 3 * @param url 4 * @return 5 */ 6 public static NetRequest.Builder get(String url){ 7 return new NetRequest.Builder() 8 .setMethod(Request.Method.GET) 9 .setUrl(url); 10 }
3、设置post请求方法
1 /** 2 * post请求 3 * @return 4 */ 5 public static NetRequest.Builder post(String url){ 6 return new NetRequest.Builder() 7 .setMethod(Request.Method.POST) 8 .setUrl(url); 9 }
4、定义开始运行start方法(即将请求添加到请求队列)
1 /** 2 *将请求添加到请求队列 3 */ 4 public static void start(NetRequest nr){ 5 requestQueue.add(nr); 6 }
5、设置取消请求方法(利用方法重载来实现取消一个和取消一组)
1 //方法重载 2 public static void cancel(Object tag){ 3 requestQueue.cancelAll(tag); 4 } 5 6 public static void cancel(RequestQueue.RequestFilter filter){ 7 requestQueue.cancelAll(filter); 8 }
这里的cancel()方法第一个请求取消方法是把所有请求都取消,第二个请求取消方法是自定义选择性的取消某个请求
第三步:调用封装好的静态类实现请求网络
<1>先讲一下使用get请求网络
1、定义一个内部类即网络回调,实现Callback接口并重写其中的两个方法,需要如何重写我已经在代码块中说明了,大家仔细阅读
1 private class NetCallBack1 implements CallBack { 2 @Override 3 public void onSuccess(String respone) { 4 这里是请求成功是执行的操作 5 记住网络请求都是异步的,所以加载数据更新界面的功能都必须在这里实现 6 不然会报空指针的错误 7 } 8 9 @Override 10 public void onError(VolleyError error) { 11 这里是执行网络请求不成功后执行的操作 12 } 13 }
2、利用工厂模式进行请求网络
1 VolleyUtil.get(你请求的网络接口) 2 .setCallBack(new NetCallBack())//这是上一步自定义的回调函数 3 .build() 4 .setPriority(Request.Priority.HIGH) 5 .addRequestHeader("apikey","你自己的apiley") 6 .start();
<2>再讲一下如何使用post请求
我这里就直接在在调用的时候就实现了callback接口,不再单独实现了
1 VolleyUtil.post("http://192.168.191.1:8080/Server/doReg.jsp") 2 .setCallBack(new CallBack() { 3 @Override 4 public void onSuccess(String respone) { 5 请求成功是执行的步骤 6 } 7 8 @Override 9 public void onError(VolleyError error) { 10 请求不成功时执行的步骤 11 } 12 }) 13 .build() 14 .addParams("name","张三") 15 .addParams("pwd","12345678") 16 .setTag("post") 17 .start();
其中addParams方法是在第二步NetRequest中有专门的定义,代码可以在第一步中寻找到
至此使用volley框架请求网络的步骤就算完成了,看起来定义比较麻烦,但是这是一劳永逸的,你在工程中只需要定义一遍,就可以在工程中需要网络请求的地方直接可以调用,注意的是网络请求还需要设置请求权限(如果大家不清楚如何设置可以去我写的关于定位的那篇文章中找到),这个需要在清单文件中申明,还有是如果你想一劳永逸还需要给工具类VolleyUtil进行初始化,这段代码可以放在全局类中即Application类中,代码如下:
1 /** 2 * Created by zhangdi on 2016/8/23. 3 */ 4 public class MyApplication extends Application { 5 6 @Override 7 public void onCreate() { 8 super.onCreate(); 9 VolleyUtil.init(this);//初始化请求队列 10 } 11 12 }
好了,到此自定义并使用Volley框架请求网络数据的步骤就算全部结束了,当然网络请求框架有很多种,Volley并不是最好的,但是它的优点也特别显明,所以在对于轻量级的请求网络数据时,使用Volley框架还是利大于弊的,这里笔者还是比较建议使用的。还是如果大家感觉这篇文章还不错的话就麻烦给推荐一下,若是有哪些地方总结的不对或是知识点有错误的地方还是希望大家评论指正,谢谢。