网络框架之----Volley的封装

Volley封装get请求和post请求

  • 定义请求回调的接口
public interface NetListener<T> {
    //参数 就是解析后的数据
    void successListener(T response );
    //参数 对错误信息进行操作
    void errorListener(VolleyError error);
}
  • 创建Volley请求
/**
 * 这个请求可以直接将数据进行解析,所以可以直接使用请求后的数据
 */

public class GsonRequest<T> extends Request<T> {
    private Gson mGson;
    private Response.Listener<T> mListener;
    private Class<T> mClass;
    //这是用于post请求的map
    private HashMap<String,String> map;



    //用于get请求
    public GsonRequest(int method, String url, Response.ErrorListener listener, Response.Listener<T> listener1, Class<T> aClass) {
        super(method, url, listener);
        mListener = listener1;
        mClass = aClass;
        mGson = new Gson();
    }

    //这是用于post接口数据的请求
    public GsonRequest(int method, String url, Response.ErrorListener listener, Response.Listener<T> listener1, Class<T> aClass, HashMap<String, String> map) {
        super(method, url, listener);
        mGson = new Gson();
        mListener = listener1;
        mClass = aClass;
        this.map = map;
    }

    //请求网络数据
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            //这是我们请求下来的数据
            String data = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            //我们直接将请求好的数据写在请求成功的方法之中
            //第一参数是解析好的的数据
            //第二参数是缓存类
            return Response.success(mGson.fromJson(data, mClass),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            //这是网络请求失败的返回结果
            return Response.error(new ParseError(e));
        }

    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return map;
    }

    //分发事件
    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }
    //数据缓存
    @Override
    public void deliverError(VolleyError error) {
        //判断 如果没有网络连接 这时我们要使用缓存数据
        if(error instanceof NoConnectionError){

            Log.d("GsonRequest", "我是缓存的数据");
            //获取缓存数据
            Cache.Entry entry = this.getCacheEntry();
            //创建请求 请求的数据就是我们自己缓存的数据
            Response<T> response = parseNetworkResponse
                    (new NetworkResponse(entry.data,entry.responseHeaders));
            deliverResponse(response.result);
        }
        super.deliverError(error);
    }
}
  • NetHelper工具类
public class NetHelper {
    private RequestQueue mRequestQueue;

    private static NetHelper ourInstance = new NetHelper();

    //在单例模式中我们对外提供了一个方法来获取对象
    public static NetHelper getInstance() {
        return ourInstance;
    }
    //为什么要把构造方法私有化?
    //不想让别人创建出对象,所以私有化 我们只使用对外提供的方法获取本类的对象
    private NetHelper() {
        getRequestQueue();
    }

    //双重校验锁
    private RequestQueue getRequestQueue(){
        //第一个判断是用于提高代码效率的
        //如果多个地方使用了这个单例,那么第一层判断就可以直接创建队列,
        // 不为空的情况就直接返回队列
        if (mRequestQueue == null){
            //加锁 保证线程不会拥挤阻塞
            synchronized (NetHelper.class){
                //如果队列为空 创建我们自己的队列
                if (mRequestQueue == null){
                    mRequestQueue = Volley.newRequestQueue(MyApp.getmContext());
                }
            }
        }
        return mRequestQueue;
    }
    /************************私有化的方法************************************/
    //这是最最基本的请求方式
    private <T> void baseRequest(Request<T> request){
        mRequestQueue.add(request);
    }



    private <T> void baseGsonRequest(String url , Class<T> mClass, final NetListener<T> listener){
        GsonRequest<T> gsonRequest = new GsonRequest<T>(Request.Method.GET, url, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.errorListener(error);
            }
        }, new Response.Listener<T>() {
            @Override
            public void onResponse(T response) {
                listener.successListener(response);
            }
        },mClass);
        mRequestQueue.add(gsonRequest);
    }




    private <T> void baseGsonPostRequest(String url, Class<T> mClass,final NetListener<T> listener, HashMap<String,String> map){
        GsonRequest<T> gsonRequest = new GsonRequest<T>(Request.Method.POST, url, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.errorListener(error);
            }
        }, new Response.Listener<T>() {
            @Override
            public void onResponse(T response) {
                listener.successListener(response);
            }
        },mClass,map);
        mRequestQueue.add(gsonRequest);
    }





    private void baseStringRequest(String url, final NetListener<String> listener){
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                listener.successListener(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.errorListener(error);
            }
        });
          mRequestQueue.add(stringRequest);

    }
    /******************对外提供的方法************************************/

    public static  void MySRequest(String url,NetListener<String> listener){
        getInstance().baseStringRequest(url,listener);
    }
    public static <T> void MyRequest(String url,Class<T> mClass,NetListener<T> listener){
        getInstance().baseGsonRequest(url,mClass,listener);
    }
    public static <T> void MyRequest(String url,Class<T> mClass,NetListener<T> listener,HashMap<String,String> map){
        getInstance().baseGsonPostRequest(url,mClass,listener,map);
    }
}
  • 在Activity中使用
//get请求用法
        NetHelper.MyRequest(url,实体类.class,定义的请求回调)
//post请求用法
        HashMap<String,String> map = new HashMap<>();
        map.put(key,value);
        NetHelper.MyRequest(url,实体类.class,定义的请求回调);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值