之前都是用自己封装的HttpClient,不过现在主流的网络请求都是用Volley,OkHttp呼声也很高。

这几个框架就不做介绍了,本文为Volley结合OkHttp处理Http请求,再结合Gson自定义Request实现Android网络功能

准备jar包:

,忽略universal-image-loader,懒得删了

RequestQueue只需要一个就好,所以我们把它放到StaticVariable中

import com.android.volley.RequestQueue;import com.liujing.csoc.utils.HttpUtils;public class StaticVariable {    private static RequestQueue mRequestQueue;    public static void clear() {        HttpUtils.cancelAllRequest();        mRequestQueue = null;    }    public static RequestQueue getRequestQueue() {        return mRequestQueue;    }    public static void setRequestQueue(RequestQueue paramRequestQueue) {        mRequestQueue = paramRequestQueue;    }}
import java.io.IOException;import java.net.HttpURLConnection;import java.net.URL;import android.text.TextUtils;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.toolbox.HurlStack;import com.android.volley.toolbox.Volley;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.OkUrlFactory;import com.liujing.csoc.application.TopSecCsocApplication;import com.liujing.csoc.iconstant.StaticVariable;public class HttpUtils {    /**     * 添加Request请求到队列中,因为我们使用OkHttp作为Volley的传输层,所以增加一个HttpStack参数     * @param request     */    public static void addRequest(Request<?> request) {        if (request != null) {            if (StaticVariable.getRequestQueue() == null) {                StaticVariable.setRequestQueue(Volley                        .newRequestQueue(TopSecCsocApplication.getContext()));            }            Volley.newRequestQueue(TopSecCsocApplication.getContext(), new OkHttpStack());            StaticVariable.getRequestQueue().add(request);        }    }    /**     * 取消所有Request     */    public static void cancelAllRequest() {        RequestQueue localRequestQueue = StaticVariable.getRequestQueue();        if (localRequestQueue != null) {            localRequestQueue.cancelAll(new RequestQueue.RequestFilter() {                @Override                public boolean apply(Request<?> request) {                    return true;                }            });            localRequestQueue.stop();        }    }    /**     * 根据标签取消指定Request     * @param tag     */    public static void cancelRequestByTag(String tag) {        if (!TextUtils.isEmpty(tag)) {            if (StaticVariable.getRequestQueue() != null) {                StaticVariable.getRequestQueue().cancelAll(tag);            }        }    }        /**     * 定义OkHttpStack     * @author Administrator     *     */    private static class OkHttpStack extends HurlStack {        private final OkUrlFactory okUrlFactory;        public OkHttpStack() {            this(new OkUrlFactory(new OkHttpClient()));        }        public OkHttpStack(OkUrlFactory okUrlFactory) {            if (okUrlFactory == null) {                throw new NullPointerException("Client must not be null.");            }            this.okUrlFactory = okUrlFactory;        }        @Override        protected HttpURLConnection createConnection(URL url)                throws IOException {            return okUrlFactory.open(url);        }    }}

结合Gson自定义Request

import java.io.UnsupportedEncodingException;import java.lang.reflect.Type;import java.util.Iterator;import java.util.Map;import com.android.volley.AuthFailureError;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;/** * Volley自定义Request * @author liujing * @param <T> */public class CsocRequest<T> extends Request<T> {    public static final int GET = Method.GET;    public static final int POST = Method.POST;    private static Gson gson = new Gson();    private Type mType;    private final ResponeListener<T> mlistener;    private Map<String, String> mParams;        //自定义回调,方便使用    public interface ResponeListener<T> extends ErrorListener, Listener<T> {    }    /**     * 默认get方式提交http请求     * @param url     * @param type     * @param params     * @param listener     */    public CsocRequest(String url, Type type, Map<String, String> params,            ResponeListener<T> listener) {        super(GET, getUrl(url, params), listener);        this.mlistener = listener;        this.mType = type;        setShouldCache(false);    }    /**     * 增加method参数选择get或post方式提交http请求     * @param method     * @param url     * @param type     * @param params     * @param listener     */    public CsocRequest(int method, String url, Type type,            Map<String, String> params, ResponeListener<T> listener) {        super(method,method==POST?url:getUrl(url, params), listener);        this.mlistener = listener;        this.mType = type;        if(method==POST){            mParams = params;        }        setShouldCache(false);    }        @Override    protected Map<String, String> getParams() throws AuthFailureError {        if (mParams != null) {            return mParams;        } else {            return super.getParams();        }    }    //构造url,get方式请求也可直接传参数    private static String getUrl(String url, Map<String, String> params) {        if (params != null) {            Iterator<String> it = params.keySet().iterator();            StringBuffer sb = null;            while (it.hasNext()) {                String key = it.next();                String value = params.get(key);                if (sb == null) {                    sb = new StringBuffer();                    sb.append("?");                } else {                    sb.append("&");                }                sb.append(key);                sb.append("=");                sb.append(value);            }            url += sb.toString();        }        return url;    }    @Override    protected Response<T> parseNetworkResponse(NetworkResponse response) {        try {            T result;            String jsonStr = new String(response.data,                    HttpHeaderParser.parseCharset(response.headers));            result = gson.fromJson(jsonStr, mType);            return Response.success(result,                    HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            e.printStackTrace();            return Response.error(new ParseError(e));        }    }    @Override    protected void deliverResponse(T response) {        mlistener.onResponse(response);    }}

大功告成,看看怎么用吧,其实就是new一个Request,再通过HttpUtils添加到队列中

Params get或post的请求参数

url 就是url

type Gson根据Type解析json

private void loadData(int pageNUM, String loadDate) {        Map<String, String> Params = new HashMap<String, String>();        Params.put("cusId", customerId);        Params.put("session_id", mSession_id);        Params.put("pageNo", String.valueOf(pageNUM));        Params.put("pageSize", String.valueOf(IConstant.PAGE_LOAD_NUM));        Params.put("date", loadDate);        String url = IConfig.URL + IConfig.CONTENT_MONITOR;        Type type = new TypeToken<ResultData<ContentMonitorBean<ContentMonitorDataBean>>>() {
     }.getType(); CsocRequest
<ResultData<BaseBean>> cr = new CsocRequest<ResultData<BaseBean>>( url, type, Params, this); HttpUtils.addRequest(cr); }

接收请求结果,刷新界面

实现前面定义的ResponeListener,onErrorResponse和onResponse代表请求失败和成功

public class BaseFragment extends Fragment implements ResponeListener<ResultData<BaseBean>> {    @Override    public void onErrorResponse(VolleyError error) {        dismissNetDialog();        Toast.makeText(mActivity, "加载失败", Toast.LENGTH_SHORT).show();    };        @Override    public void onResponse(ResultData<BaseBean> response) {        dismissNetDialog();        if (response != null) {        //更新数据,刷新界面....                }    }}

更多相关文章

  1. API Demos 2.2 研读笔记(9)——通过调用子Activity返回值
  2. Android消息机制简述(Java层)
  3. ThreadPoolExecutor 快速实际应用
  4. Android(安卓)自定义View(四) 时钟clockView
  5. android 权限库EasyPermissions
  6. Android(安卓)ApiDemos示例解析(45):App->Text-To-Speech
  7. 详解Android提交数据到服务器的两种方式四种方法
  8. Facebook 客户端优化实践后,App 启动提速65%
  9. 带你一步一步深入Handler源码,拿下面试官不在话下!

随机推荐

  1. Android View源码解析
  2. Android之组件详解
  3. android bolg and other
  4. android 混编源代码
  5. Android AIDL进程间通信的简单使用
  6. android的单选框例子
  7. Android Studio 生成UML类图
  8. android 横向切换 activity
  9. android/IOS SDK怎么判断用户是否安装了
  10. android 自定义具有反弹效果的ScrollView