Volley请求封装

在做项目时由于我们请求的数据量并不是很大,所以一直使用的都是Volley进行HTTP请求。

使用Volley的方法很简单,具体请参考郭神(http://blog.youkuaiyun.com/guolin_blog/article/details/17482095)。

因为项目在很多地方都需要进行Http请求。我将Volley的请求进行了封装,主要分为下面几个部分:

1.通过单例模式获取请求队列的对象(RequestQueue);

2.写了一个请求的父类,主要方法有封装url和参数,生成全新的带参数的url地址,还有就是将请求的request加入到请求队列中。

3.接口回调,包括获取成功和失败的回调。

4.封装Volley的StringRequest,JSonObjectRequest以及JsonArrayRequest的get以及post方法。

具体的我就上代码了。

(1)通过单例模式获取RequestQueue对象

/**
 * Volley全局管理类
 * 通过单例模式获取请求队列
 * Created by wyj on 2017/7/14.
 */

public class GlobalVolley {

    private static RequestQueue mRequestQueue;

    /**
     * 获取Volley请求队列
     * @param mContext 上下文
     * @return 请求队列对象
     */
    public static RequestQueue getInstance(Context mContext){
        if (mRequestQueue == null){
            mRequestQueue = Volley.newRequestQueue(mContext);
        }
        return mRequestQueue;
    }
}


(2)请求父类

/**
 * Volley请求基类
 * Created by wyj on 2017/7/14.
 */

public class BaseVolleyRequest<T> {

    private static final String TAG = "BaseVolleyRequest";
    private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";
    private Context mContext;
    private RequestQueue mRequestQueue;

    /**
     * 构造方法 初始化请求队列
     *
     * @param mContext
     */
    public BaseVolleyRequest(Context mContext) {
        this.mContext = mContext;
        mRequestQueue = GlobalVolley.getInstance(mContext);
    }

    /**
     * 将url和参数生成新的url
     *
     * @param url    请求地址,不带参数
     * @param params 请求参数集合
     * @return 带参数的url
     */
    public String createGetUrlWithParams(String url, Map<String, String> params) {
        String newUrl = "";
        if (params != null) {
            StringBuffer mStringBuffer = new StringBuffer(url);
            if (!url.contains("?")) {
                mStringBuffer.append("?");
            }
            for (Map.Entry<String, String> map : params.entrySet()) {
                String key = map.getKey();
                String value = "";
                if (map.getValue() == null) {
                    value = "";
                } else {
                    value = map.getValue();
                }
                mStringBuffer.append(key);
                mStringBuffer.append("=");
                try {
                    value = URLEncoder.encode(value, DEFAULT_PARAMS_ENCODING);
                    mStringBuffer.append(value);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                mStringBuffer.append("&");
            }
            // 删除最后一个&符号
            mStringBuffer.deleteCharAt(mStringBuffer.length() - 1);
            newUrl = mStringBuffer.toString();
            Log.e(TAG, "请求的新地址:"+newUrl );
        }
        return newUrl;
    }

    /**
     * 将请求添加到队列中
     * @param request 请求
     */
    public void addRequest(Request request){
        mRequestQueue.add(request);
    }
}

(3)StringRequest的封装

**
 * 字符串、文本请求封装类
 * Created by wyj on 2017/7/14. */

public class StringRequestVolley extends BaseVolleyRequest {

    /**
     * 构造方法 初始化请求队列
     *
     * @param mContext
     */
    public StringRequestVolley(Context mContext) {
        super(mContext);
    }

    /**
     * Stringrequest的get请求,此方法中的url带参数
     * @param url 请求地址
     * @param listener 回调对象
     */
    public void StringRequstGet(String url, final CallBackListener<String> listener){
        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                listener.onSuccessResponse(s);
            }
        },new Response.ErrorListener(){

            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        });
        this.addRequest(request);
    }

    /**
     * get请求,带参数,url中无具体参数
     * @param url 请求url
     * @param params    请求url的参数
     * @param listener  请求回调
     */
    public void StringRequestGet(String url, Map<String,String> params,CallBackListener<String> listener){
        // 获取新的url,将参数拼进url中
        String newUrl = this.createGetUrlWithParams(url,params);
        this.StringRequstGet(newUrl, listener);
    }

    /**
     * post请求
     * @param url 请求的url
     * @param params    具体参数
     * @param listener  请求回调
     */
    public void StringRequestPost(String url, final Map<String,String> params, final CallBackListener<String> listener){
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                listener.onSuccessResponse(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        }){
            // 添加post参数
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };

        this.addRequest(request);
    }
}


(4)JsonObjectRequest的封装

/**
 * json对象请求方法封装
 * Created by wyj on 2017/7/14.
 */

public class JsonObjectRequestVolley extends BaseVolleyRequest {

    /**
     * 构造方法 初始化请求队列
     *
     * @param mContext
     */
    public JsonObjectRequestVolley(Context mContext) {
        super(mContext);
    }

    /**
     * get请求,url带参数
     * @param url
     * @param listener
     */
    public void jsonObjectGet(String url, final CallBackListener<JSONObject> listener){
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                listener.onSuccessResponse(jsonObject);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        });

        this.addRequest(request);
    }

    /**
     * get请求,带参数
     * @param url
     * @param params
     * @param listener
     */
    public void jsonObjectGet(String url, Map<String,String> params,CallBackListener<JSONObject> listener){
        String newUrl = this.createGetUrlWithParams(url,params);
        jsonObjectGet(newUrl, listener);
    }

    /**
     * post 请求带参数
     * @param url
     * @param params
     * @param listener
     */
    public void jsonObjectPost(String url, final Map<String,String> params, final CallBackListener<JSONObject> listener){
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                listener.onSuccessResponse(jsonObject);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };

        this.addRequest(request);
    }
}


(4)JsonArrayRequest的封装

/**
 * JsonArray请求封装类
 * Created by wyj on 2017/7/14.
 */

public class JsonArrayRequestVolley extends BaseVolleyRequest {

    /**
     * 构造方法 初始化请求队列
     *
     * @param mContext
     */
    public JsonArrayRequestVolley(Context mContext) {
        super(mContext);
    }

    /**
     * json数组Get请求
     * @param url 请求地址
     * @param listener 接口回调
     */
    public void jsonArrayGet(String url, final CallBackListener listener){
        JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray jsonArray) {
                listener.onSuccessResponse(jsonArray);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        });

        this.addRequest(request);
    }

    /**
     * 带参数的get请求
     * @param url
     * @param params
     * @param listener
     */
    public void jsonArrayGet(String url, Map<String,String> params,CallBackListener listener){
        String newUrl = this.createGetUrlWithParams(url,params);
        jsonArrayGet(newUrl,listener);
    }

    public void jsonArrayPost(String url, final Map<String,String> params, CallBackListener listener){
        JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray jsonArray) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

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

        this.addRequest(request);
    }
}

接口回调

/**
 * 接口回调
 * Created by wyj on 2017/7/14.
 */

public interface CallBackListener<T> {

    // 请求成功的回调
    void onSuccessResponse(T response);
    // 请求失败的回调
    void onErrorResponse(VolleyError error);
}


测试使用,我用的是聚合数据进行天气获取

 StringRequestVolley volley = new StringRequestVolley(this);
                volley.StringRequestGet(url, params, new CallBackListener<String>() {
                    @Override
                    public void onSuccessResponse(String response) {
                        Log.e(TAG, "onSuccessResponse:"+response );
                        Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(MainActivity.this,error.getMessage(),Toast.LENGTH_LONG).show();
                    }
                });


特别注意:如果post请求对数据有顺序要求的话,请使用LinkedHashMap,它可以保证put进的数据和获取的数据顺序一致。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值