public class VolleySingle { private static Context mContext; private RequestQueue queue;//请求队列 private static VolleySingle ourInstance = new VolleySingle(); //获取单例的对象 public static VolleySingle getInstance() { return ourInstance; } private VolleySingle() { //获取Application里面的context //mContext =context.getApplicationContex-t(); mContext = MyApplication.getContext(); queue = getQueue();//初始化我的请求队列 } //提供一个方法新建请求队列 public RequestQueue getQueue(){ if (queue == null){ if(MyApplication.getContext()==null){ Log.d("Sysout","null"); } queue = Volley.newRequestQueue(MyApplication.getContext()); } return queue; } public static final String TAG = "VolleySingleton"; //添加请求 public <T> void _addRequest(Request<T> request){ request.setTag(TAG);//为我的请求添加标签,方便管理 queue.add(request);//将请求添加到队列当中 } public <T> void _addRequest(Request<T> request, Object tag){ request.setTag(tag); queue.add(request); } public void _addRequest(String url, //这里为我的成功时候的回调加上String类型的泛型 Response.Listener<String> listener, Response.ErrorListener errorListener){ //创建StringRequest // 三个参数分别是 url接口网址 //成功时候的回调,失败时候的回调 StringRequest stringRequest = new StringRequest(url, listener,errorListener); //将请求加入到队列 _addRequest(stringRequest); } public <T> void _addRequest(String url, Response.Listener<T> listener, Response.ErrorListener errorListener, Class<T> mClass){ GsonRequest gsonRequest = new GsonRequest(Request.Method.GET, url,errorListener,listener,mClass); _addRequest(gsonRequest); } //这个方法是将请求移除队列 public void removeRequest(Object tag){ queue.cancelAll(tag);//根据不同的tag移除出队列 } public static void addRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener){ //获取单例的对象,调用添加请求的方法(这个是StringRequest的请求) getInstance()._addRequest(url,listener,errorListener); } public static <T> void addRequest(String url, Response.Listener<T> listener, Response.ErrorListener errorListener, Class<T> mClass){ //同上方法将GsonRequest请求加入单例的队列里 getInstance()._addRequest(url, listener,errorListener,mClass); } /** * GsonRequest * @param <T> */ class GsonRequest<T> extends Request<T> { private Response.Listener<T> mListener; private Gson mGson; private Class<T> mClass;//以后的实体类 //构造方法中我们传入的参数第一个 请求数据类型,第二个参数,URL //第三个参数失败时的回调,第四个成功时候的回调,第五个就是实体类 //构造方法 public GsonRequest(int method, String url, Response.ErrorListener listener, Response.Listener<T> mListener, Class<T> mClass) { super(method, url, listener); this.mListener = mListener; this.mGson = new Gson(); this.mClass = mClass; } //因为上面的构造方法中第一个参数就是我的请求类型,都是Get类型,所以我在写一个构造方法简化一下代码 public GsonRequest(String url, Response.ErrorListener listener, Response.Listener mListener, Class mClass){ this(Method.GET,url,listener,mListener,mClass); } //复写的方法 这个方法里我们添加的是网络请求,并且将我们想得到的数据进行解析. @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { //首先要获取我们想要解析的数据 String data = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //这里我们返回的就是成功时候的回调.直接将数据解析,注意一下第二个参数是缓存入口,这里我们直接设置的就是HttpHeaderParser.parseCacheHeaders(response) return Response.success(mGson.fromJson(data,mClass),HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { //若出现异常,返回失败时候的回调 return Response.error(new ParseError(e)); } } //这个方法是对请求的response进行的反馈. @Override protected void deliverResponse(T response) { mListener.onResponse(response); } } }
Volley封装
最新推荐文章于 2020-03-24 20:53:25 发布