<Excerpt in index | 首页摘要> 
Android解决Volley乱码问题
JsonObjectRequest Post提交参数提交不上去
请求创建封装库
<The rest of contents | 余下全文> 
引言
各种原因,现在项目网络框架决定从okhttp切换至volley。
然后自己封装了一个简单的封装库和解决乱码问题,还有JsonRequest重写getParams()无效的一个替代解决方案.
StringRequest乱码问题
先要知道乱码问题出在哪里。
我们常用编码是UTF-8.而Volley默认的解码方式是根据http协议头的编码来解码的。
一种方式是要求后台在所有请求的返回头部添加charset=utf8,但是这就有点麻烦后台了。
我们是要自立更生的!
我们看下Volley的StringRequest源码.
1 2 3 4 5 6 7 8 9 10 11
   | @Override protected Response<String> parseNetworkResponse(NetworkResponse response) {   String parsed;   try {          parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));   } catch (UnsupportedEncodingException e) {     parsed = new String(response.data);   }   return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); }
   | 
 
如果你是直接导入的Volley源码的方式,那么找到StringRequest,然后修改这里修改为:
1 2 3 4 5 6 7 8 9 10
   | @Override protected Response<String> parseNetworkResponse(NetworkResponse response) {   String parsed;   try {     parsed = new String(response.data, "UTF-8");   } catch (UnsupportedEncodingException e) {     parsed = new String(response.data);   }   return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); }
   | 
 
如果你是直接通过Gradle导入的,那么你需要创建一个类继承自StringRequest然后重写这个方法。修改成这样。
JsonObjectRequest Post提交参数提交不上去
如果你使用JsonObjectRequest你会发现重写getParams()方法,提交参数服务器那边是收不到的。
除非你的服务器是支持Json格式的提交,当一般都不会支持。
那你你需要重写两个方法!
第一种方式.继承自JsonObjectRequest 或者 直接重写、改写为如下的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
   | @Override   public String getBodyContentType() {     return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();   }  
  @Override protected Response<String> parseNetworkResponse(NetworkResponse response) {   String parsed;   try {     parsed = new String(response.data, "UTF-8");   } catch (UnsupportedEncodingException e) {     parsed = new String(response.data);   }   return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); }
  @Override public byte[] getBody() {   String mRequestBody = appendParameter(NetConstant.AUTO_ROLL_IMG, map);   try {     return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);   } catch (UnsupportedEncodingException uee) {     VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",                   mRequestBody, PROTOCOL_CHARSET);     return null;   } }
  private String appendParameter(String url, Map<String, String> params) {   Uri uri = Uri.parse(url);   Uri.Builder builder = uri.buildUpon();   for (Map.Entry<String, String> entry : params.entrySet()) {     builder.appendQueryParameter(entry.getKey(), entry.getValue());   }   return builder.build().getQuery(); }
 
   | 
 
当然,还有第二种方式,就是自己写一个,我这里是继承自之前改写的StringRequest的StrRequest写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
   | package com.qingxiang.ui.common.volley;
 
  import com.android.volley.Response; import com.android.volley.VolleyError;
  import org.json.JSONException; import org.json.JSONObject;
 
  public class JsonRequest extends StrRequest {
    private Response.Listener<JSONObject> mListener;
    public JsonRequest(int method, String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {     super(method, url, null, errorListener);     mListener = listener;   }
    public JsonRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {     super(url, null, errorListener);     mListener = listener;   }
    @Override   protected void deliverResponse(String response) {     try {       JSONObject obj = new JSONObject(response);       mListener.onResponse(obj);     } catch (JSONException e) {       deliverError(new VolleyError("Json转换异常"));     }   } }
 
   | 
 
构造Request的工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
   | package com.qingxiang.ui.common.volley;
  import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.Response;
  import org.json.JSONObject;
  import java.util.HashMap; import java.util.Map; import java.util.Set;
 
 
 
 
  public class VU {     private String mUrl;     private int mMethod;     private Object mTag;     private Map<String, String> mParams;     private Response.Listener<JSONObject> mRespListener;     private Response.ErrorListener mErrorListener;
      
 
 
 
      private VU(String url) {         mUrl = url;         mParams = new HashMap<>();     }
      public static VU get(String url) {         VU vu = new VU(url);         vu.mMethod = Request.Method.GET;         return vu;     }
      public static VU post(String url) {         VU vu = new VU(url);         vu.mMethod = Request.Method.POST;         return vu;     }
      public VU TAG(Object tag) {         mTag = tag;         return this;     }
      public VU addParams(String key, String value) {         mParams.put(key, value);         return this;     }
      public VU respListener(Response.Listener<JSONObject> listener) {         mRespListener = listener;         return this;     }
      public VU errorListener(Response.ErrorListener listener) {         mErrorListener = listener;         return this;     }
      public JsonRequest build() {         if (mMethod == Request.Method.GET) {             StringBuffer sb = new StringBuffer(mUrl);             sb.append("?");             Set<String> keys = mParams.keySet();             int size = 0;             for (String key : keys) {                 sb.append(key);                 sb.append("=");                 sb.append(mParams.get(key));                 if (size < (keys.size() - 1))                     sb.append("&");                 size++;             }             mUrl = sb.toString();         }
          JsonRequest request = new JsonRequest(mMethod, mUrl, mRespListener, mErrorListener) {             @Override             protected Map<String, String> getParams() throws AuthFailureError {                 return mParams;             }         };         if (mTag != null)             request.setTag(mTag);         return request;     } }
 
   |