package com.dh.foundation.utils; import android.os.Handler; import android.os.Looper; import com.dh.foundation.volley.AuthFailureError; import com.dh.foundation.volley.DefaultRetryPolicy; import com.dh.foundation.volley.Response; import com.dh.foundation.volley.VolleyError; import com.dh.foundation.volley.toolbox.StringRequest; import com.dh.foundation.exception.DataFormatError; import com.dh.foundation.exception.NetRequestError; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; import java.util.Map; /** * 网络请求调用类 * Created By: Seal.Wu * Date: 2015/10/20 * Time: 16:11 */ class NetRequest<ReturnObj> extends StringRequest { private static final Handler handler = new Handler(Looper.getMainLooper()); private final static Gson gson = new Gson(); /** * 网络请求参数 */ private final RequestParams requestParams; public NetRequest(int method, String url, RequestParams requestParams, Type returnType, HttpNetUtils.HttpJsonRequest<ReturnObj> requestListener) { super(method, url, new Listener<ReturnObj>(returnType, requestListener), new ErrorListener(requestListener)); this.requestParams = requestParams; DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(30 * 1000, 0, 1); setRetryPolicy(retryPolicy); setShouldCache(false); Object tag = getTag(method, url, requestParams); setTag(tag); } private static String getTag(int method, String url, RequestParams requestParams) { return method == Method.GET ? url : url + (requestParams.isRestStyle() ? requestParams.getParamObjJsonData() : requestParams.getParams()); } @Override public Map<String, String> getHeaders() throws AuthFailureError { if (requestParams.getHeaders() != null) { return requestParams.getHeaders(); } return super.getHeaders(); } @Override protected Map<String, String> getParams() throws AuthFailureError { return requestParams.getParams(); } @Override public byte[] getBody() throws AuthFailureError { if (requestParams.isRestStyle()) { try { final String json = gson.toJson(requestParams.getParamsObj()); return json.getBytes(getParamsEncoding()); } catch (UnsupportedEncodingException e) { DLoggerUtils.e(e); return null; } } return super.getBody(); } @Override public String getBodyContentType() { if (requestParams.isRestStyle()) { return "application/json;charset=" + getParamsEncoding(); } else { return super.getBodyContentType(); } } @Override protected String getParamsEncoding() { return requestParams.getParamsEncoding(); } private static class Listener<ReturnObj> implements Response.Listener<String> { /** * 返回对象数据类型 */ private final Type returnType; /** * 返回数据监听接口 */ private final HttpNetUtils.HttpJsonRequest requestListener; public Listener(Type returnType, HttpNetUtils.HttpJsonRequest<ReturnObj> requestListener) { this.returnType = returnType; this.requestListener = requestListener; } @Override public void onResponse(final String response) { DLoggerUtils.i(response); handler.post(new Runnable() { @Override public void run() { ReturnObj o; try { o = gson.fromJson(response, returnType); } catch (JsonSyntaxException e) { DLoggerUtils.e(e); requestListener.onFailed(new DataFormatError(e)); requestListener.onFinished(); return; } requestListener.onSuccess(o); requestListener.onFinished(); } }); } } private static class ErrorListener implements Response.ErrorListener { /** * 返回数据监听接口 */ private final HttpNetUtils.HttpJsonRequest requestListener; public ErrorListener(HttpNetUtils.HttpJsonRequest requestListener) { this.requestListener = requestListener; } @Override public void onErrorResponse(final VolleyError error) { handler.post(new Runnable() { @Override public void run() { DLoggerUtils.e(error); requestListener.onFailed(new NetRequestError(error)); requestListener.onFinished(); } }); } } }