Volly的简单封装

今天简单说下Volly框架的简单封装,包括请求头,请求body,请求方法等的简单封装,这篇是呼应上一篇的,呼应上一个的介绍使用

首先要说的就是VollyBean,都是get,set没啥解释的

import java.util.Map;

/**
 * @author penguinfool
 * Volly通信请求类
 */
public class VollyBean {
    int method;
    String url;
    Map headers;
    Map params;

    /**
     * 构造函数
     */
    public VollyBean() {
        super();
    }

    /**
     * @param method 请求类型
     * @param url 请求地址
     * @param headers 请求头
     * @param params 请求参数
     */
    public VollyBean(int method, String url, Map headers,
            Map params) {
        super();
        this.method = method;
        this.url = url;
        this.headers = headers;
        this.params = params;
    }

    /**
     * @return 请求类型
     */
    public int getMethod() {
        return method;
    }

    /**
     * @param method 请求类型
     */
    public void setMethod(int method) {
        this.method = method;
    }

    /**
     * @return 请求地址
     */
    public String getUrl() {
        return url;
    }

    /**
     * @param url 请求地址
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * @return 请求头
     */
    public Map getHeaders() {
        return headers;
    }

    /**
     * @param headers 请求头
     */
    public void setHeaders(Map headers) {
        this.headers = headers;
    }

    /**
     * @return 请求参数
     */
    public Map getParams() {
        return params;
    }

    /**
     * @param params 请求参数
     */
    public void setParams(Map params) {
        this.params = params;
    }

}

VollyRequestManager类,这里面封装了请求的方法,请求头等,他的请求成功和失败都是Volly框架中封装好的,我们可以自定义一个回调,将结果回调到我们所需的界面上

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;

import android.content.Context;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.rgsc.base.core.net.NetUtils;

/**
 * @author penguinfool
 * 请求管理类
 */
public class VollyRequestManager {
    private static final String TAG = "VollyRequestManager";
    private static volatile VollyRequestManager instance = null;
    private RequestQueue mRequestQueue = null;
    private static final int TIMEOUT = 5000;

    /**
     * @param context
     *            上下文
     */
    private VollyRequestManager(Context context) {
        initRequestqueue(context);
    }

    /**
     * 初始化mRequestQueue
     * 
     * @param context
     *            上下文
     */
    public void initRequestqueue(Context context) {
        this.mRequestQueue = Volley.newRequestQueue(context);
    }

    /**
     * @param context
     *            上下文
     * @return 单例
     */
    public static VollyRequestManager getInstance(Context context) {
        if (null == instance) {
            synchronized (VollyRequestManager.class) {
                if (null == instance) {
                    instance = new VollyRequestManager(context);
                }
            }
        }
        return instance;
    }

    /**
     * @return 请求队列
     */
    public RequestQueue getRequestQueue() {
        return this.mRequestQueue;
    }

    /**
     * @param url
     *            请求地址
     * @param headers
     *            请求头
     * @param params
     *            请求参数
     * @param successListener
     *            成功监听
     * @param errorListener
     *            失败监听
     * @throws UnsupportedEncodingException
     *             异常
     */
    private void doGet(String url, final Map headers,
            final Map params,
            Response.Listener successListener,
            Response.ErrorListener errorListener)
            throws UnsupportedEncodingException {

        String requestUrl = null;
        // 如果是GET请求,则请求参数在URL中
        if (params != null && !params.isEmpty()) {
            String param = urlEncode(params);
            requestUrl = url + "?" + param;
        } else {
            requestUrl = url;
        }
        System.out.println("### volley requet:" + url);

        StringRequest stringRequest = new StringRequest(Method.GET, requestUrl,
                successListener, errorListener) {
            // 设置头信息
            @Override
            public Map getHeaders() throws AuthFailureError {

                if (headers != null && !headers.isEmpty()) {
                    return headers;
                } else {
                    return Collections.emptyMap();
                }
            }

            // 为空时参数params传入null
            @Override
            protected Map getParams() throws AuthFailureError {
                return params;
            }

        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(TIMEOUT,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        mRequestQueue.add(stringRequest);

    }

    /**
     * @param url
     *            请求地址
     * @param headers
     *            请求头
     * @param params
     *            请求参数
     * @param successListener
     *            成功监听
     * @param errorListener
     *            失败监听
     */
    private void doPost(String url, final Map headers,
            final Map params,
            Response.Listener successListener,
            Response.ErrorListener errorListener) {

        // L.i(TAG + "doPost", url);

        // for (Map.Entry entry :headers.entrySet()) {
        // System.out.println("hkey= " + entry.getKey() + " and hvalue= " +
        // entry.getValue());
        // }
        //

        //
        // for (Map.Entry entry :params.entrySet()) {
        // System.out.println("pkey= " + entry.getKey() + " and pvalue= " +
        // entry.getValue());
        // }

        StringRequest stringRequest = new StringRequest(Method.POST, url,
                successListener, errorListener) {

            @Override
            protected Map getParams() throws AuthFailureError {
                return params;
            }

            @Override
            public Map getHeaders() throws AuthFailureError {

                if (headers != null && !headers.isEmpty()) {
                    return headers;
                } else {
                    return Collections.emptyMap();
                }

            }

        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(TIMEOUT,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        mRequestQueue.add(stringRequest);

    }

    /**
     * @param url
     *            请求地址
     * @param headers
     *            请求头
     * @param params
     *            请求参数
     * @param successListener
     *            成功监听
     * @param errorListener
     *            失败监听
     * @throws Exception
     *             异常
     */
    private void doPut(String url, final Map headers,
            final Map params,
            Response.Listener successListener,
            Response.ErrorListener errorListener) {

        String requestUrl = null;
        /*
         * if (params != null && !params.isEmpty()) { String param =
         * urlEncode(params); requestUrl = url + "?" + param; } else {
         * requestUrl = url; } L.i(TAG, requestUrl);
         */
        StringRequest stringRequest = new StringRequest(Method.PUT, url,
                successListener, errorListener) {
            // 设置头信息
            @Override
            public Map getHeaders() throws AuthFailureError {

                if (headers != null && !headers.isEmpty()) {
                    return headers;
                } else {
                    return Collections.emptyMap();
                }
            }

            @Override
            protected Map getParams() throws AuthFailureError {
                return params;
            }

        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(TIMEOUT,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        mRequestQueue.add(stringRequest);

    }

    /**
     * 缺省,不推荐使用
     */
    private void doDelete() {
        // .......
    }

    /**
     * @param vollyBean
     *            请求bean
     * @param successListener
     *            成功监听
     * @param errorListener
     *            失败监听
     * @throws UnsupportedEncodingException
     *             异常
     */
    public void request(VollyBean vollyBean,
            Response.Listener successListener,
            Response.ErrorListener errorListener)
            throws UnsupportedEncodingException {

        if (NetUtils.isAvailable()) {

            switch (vollyBean.getMethod()) {

            case Method.GET:
                doGet(vollyBean.getUrl(), vollyBean.getHeaders(),
                        vollyBean.getParams(), successListener, errorListener);
                break;

            case Method.POST:

                doPost(vollyBean.getUrl(), vollyBean.getHeaders(),
                        vollyBean.getParams(), successListener, errorListener);

                break;

            case Method.PUT:
                doPut(vollyBean.getUrl(), vollyBean.getHeaders(),
                        vollyBean.getParams(), successListener, errorListener);

                break;

            case Method.DELETE:

                doDelete();
                break;

            default:
                break;
            }
        } else {
            errorListener.onErrorResponse(null);
        }
    }

    /**
     * @param params
     *            请求参数
     * @return 进行urlEncode后的请求地址
     * @throws UnsupportedEncodingException
     *             异常
     */
    private String urlEncode(Map params)
            throws UnsupportedEncodingException {
        Iterator iter = params.keySet().iterator();
        int i = 0;
        StringBuffer sb = new StringBuffer();

        while (iter.hasNext()) {
            String key = iter.next();
            String value = params.get(key);

            if (i != 0) {
                sb.append("&");
            }
            sb.append(key);
            sb.append("=");
            sb.append(URLEncoder.encode(value, "utf-8").toString());

            i++;
        }
        return sb.toString();
    }
}

/**
 * 
 **/
public class VollyBeanFactory {
    private static VollyBeanFactory instance = new VollyBeanFactory();

    /**
     * 私有构造函数
     */
    private VollyBeanFactory() {

    }

    /**
     * @return 单例
     */
    public static VollyBeanFactory getInstance() {
        if (instance == null) {
            synchronized (VollyBeanFactory.class) {
                instance = new VollyBeanFactory();
            }
        }
        return instance;
    }

    /**
     * @param username
     *            用户名
     * @param pwd
     *            密码
     * @return 请求bean
     */
    public VollyBean getLoginBean(String username, String pwd) {
        Map params = new HashMap();
        params.put(Constant.HTTP_PARAM_USERNAME, username);
        params.put(Constant.HTTP_PARAM_PWD, pwd);
        VollyBean vollyBean = new VollyBean();
        vollyBean.setMethod(Method.POST);// 设置请求方式
        SLog.console("请求地址:" + ServerConfig.getInstance().getServerUrl());
        vollyBean.setUrl(ServerConfig.getInstance().getServerUrl()); // 设置请求地址
        Map header = new HashMap();
        header.put("Content-Type", "application/x-www-form-urldecoded");
        vollyBean.setHeaders(header); // 设置请求头
        vollyBean.setParams(params); // 设置请求参数
        return vollyBean;
    }
}

接下来看下实际的调用

public void log(String username, String pwd,
            Response.Listener<String> successListener,
            Response.ErrorListener errorListener)
            throws UnsupportedEncodingException {
        VollyBean bean = VollyBeanFactory.getInstance().getLoginBean(username,
                pwd);
        man.request(bean, successListener, errorListener);
    }

Volly基本就是这个样子了,注意哈,Volly是有jar包的,上网上随便下载一个就行

你可能感兴趣的:(Android,tool)