Volley自定义一个Request
来源:互联网 发布:微机原理接口编程题 编辑:程序博客网 时间:2024/05/17 07:25
之前通过源码简单的了解一下Volley.
1.Volley源码学习笔记_RequestQueue和BasicNetWork
2.Volley源码学习笔记_ExecutorDelivery
3.Volley源码学习笔记_CacheDispatcher和NetworkDispatcher
4.Volley源码学习笔记_Request
现在我们可以尝试自定义一个Volley请求。可以适用一般的get,post(请求类型是String)以及图片上传。
用到的jar:volley.jar, httpmime-4.1.1.jar
继承Request,并实现他的2个方法,之前的源码解析中我们也看了这2个方法是干什么的。
public class MyVolleyRequest extends Request<String> { //构造函数 public MyVolleyRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); }//对返回的数据进行解析 @Override protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) { return null; }//返回请求成功的数据 @Override protected void deliverResponse(String s) { }}
定义一些参数
private MultipartEntity entity ;//一些带有关文件参数和读取的类 private Map<String, String> header;//请求头信息 private Response.Listener<String> mListener;//请求成功的监听 private Response.ErrorListener mErrorListener;//请求错误的监听 private String bodyContentType;//文件类型 private Map<String, String> params; private List<File> files; private String fileName;//文件组相关的参数名称 private int kVolleyTimeOutMS=20*1000;//超时时间 private int kVolleyMaxRetryNum =2;//超时重试时间 private Priority mPriority = Request.Priority.NORMAL;//设置优先级
可以通过构造函数来设置响应的值,也可以设置set方法
public MyVolleyRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); }//get请求 public MyVolleyRequest(String url, VolleyResponseListener listener,Request.Priority priority,String tag) { this(Method.GET, url, listener.getmErrorListener()); this.listener = listener; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); if(priority!=null){ this.mPriority =priority; } } //post请求 public MyVolleyRequest(String url, Map<String, String> header,Map<String, String> params, VolleyResponseListener listener,Request.Priority priority,String tag) { this(Method.POST, url, listener.getmErrorListener()); this.listener = listener; this.header = header; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); this.params = params; if(priority!=null){ this.mPriority =priority; } setTagAndRetryPolicy(tag,kVolleyTimeOutMS,kVolleyMaxRetryNum); } //上传图片 public MyVolleyRequest(String url, Map<String, String> header, VolleyResponseListener listener, Map<String, String> params, List<File> files, String fileName,Request.Priority priority,String tag) { super(Method.POST, url, listener.getmErrorListener()); this.listener = listener; this.header = header; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); this.params = params; this.files = files; this.fileName = fileName; entity= new MultipartEntity(); bodyContentType =entity.getContentType().getValue(); buildMultipartEntity(); if(priority!=null){ this.mPriority =priority; } }
// 编辑上传文件和参数的加到entity中 private void buildMultipartEntity() { try { if (files != null && files.size() > 0) { for (File f : files) { //这里要是直接new FileBody(f),默认的content-type是application/octet-stream FileBody fileBody = new FileBody(f,"image/jpeg"); entity.addPart(fileName, fileBody); } long fileLength = entity.getContentLength(); Log.i("Volley_qy", "上传文件的数目是:" + files.size() + ",上传文件的长度是: " + fileLength + " byte"); } if (params != null && params.size() > 0) { for (Map.Entry<String, String> entry : params.entrySet()) { Log.i("Volley_qy", "上传文件的参数是:(" + entry.getKey() + ":" + entry.getValue() + ")"); entity.addPart(entry.getKey(), new StringBody(entry.getValue())); } } } catch (UnsupportedEncodingException e) { VolleyLog.e("UnsupportedEncodingException"); } }
之后看看其他的方法
1.parseNetworkResponse
//这里就直接按照StringJson中的解析方式来了 @Override protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) { String parsed; try { parsed = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers)); } catch (UnsupportedEncodingException var4) { parsed = new String(networkResponse.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(networkResponse)); }
2.deliverResponse
//请求接口成功 protected void deliverResponse(String s) { Log.i("Volley_qy","请求成功返回的数据是:"+s); mListener.onResponse(s); }
3.getParams和geBody
//post请求,getparams一般不会调用,如果Request直接接触JsonRequest就会直接走getbody。但是你看源码就会发现,getbody中也会调用getParams() @Override public Map<String, String> getParams() { return params; } @Override public byte[] getBody() throws AuthFailureError { if(entity!=null){ //文件上传 ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { entity.writeTo(bos); return bos.toByteArray(); } catch (IOException e) { if(mErrorListener!=null){ mErrorListener.onErrorResponse(new ParseError()); } Log.e("Volley_qy","============IOException writing to ByteArrayOutputStream"); } } return super.getBody(); }
3.getHeaders
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = super.getHeaders(); if (headers == null || headers.equals(Collections.emptyMap())) { if (header != null && !header.equals(Collections.emptyMap())) { headers = header; } else { headers = new HashMap<>(); } } return headers; }
4.getContentType
@Override public String getBodyContentType() { if (bodyContentType == null || bodyContentType.equals("")) { bodyContentType = super.getBodyContentType(); } return bodyContentType; }
5.设置 优先级
@Override public Priority getPriority() { return mPriority; }
下面看一下具体的使用
Volley使用3步骤
1.创建请求队列
2.创建request
3.将请求添加到队列里
创建请求队列
public class VolleyApplication extends Application { public static RequestQueue mLocalRequestQueue=null; public static Context context; @Override public void onCreate() { super.onCreate(); context =this; } public static RequestQueue getmLocalRequestQueue() { if(mLocalRequestQueue ==null){ synchronized (RequestQueue.class){ if(mLocalRequestQueue == null){ mLocalRequestQueue = Volley.newRequestQueue(context); } } } return mLocalRequestQueue; }}//然后在清单文件中添加这个application,还有请求网络的权限
创建request
MyVolleyRequest request =new MyVolleyRequest(MyAPI.getTest,new VolleyResponseListener(){ @Override public void onSuccessLoad(String string) { mDialog.dismiss(); Log.i("TTT", "获取数据成功---1:" + string); } @Override public void onFailedLoad(VolleyError error) { Log.i("TTT", "获取数据失败---1:" ); mDialog.dismiss(); } }, Request.Priority.NORMAL,"get1"); MyVolleyRequest request2 =new MyVolleyRequest(MyAPI.getTest,new VolleyResponseListener(){ @Override public void onSuccessLoad(String string) { mDialog.dismiss(); Log.i("TTT", "获取数据成功---2:" + string); } @Override public void onFailedLoad(VolleyError error) { Log.i("TTT", "获取数据失败---2:" ); mDialog.dismiss(); } }, Request.Priority.HIGH,"get2");
添加到请求队列
VolleyApplication.getmLocalRequestQueue().add(request); VolleyApplication.getmLocalRequestQueue().add(request2);
- 输出成功
- 获取数据成功—2:{“code”:”200”,”msg”:”获取数据成功”,”data”:[]}
获取数据成功—1:{“Data”:[{“CouponNumber”:”HYFB4GNN9U”,”CreateDate”:”2017-05-23”,”Status”:”3”}],”ErrorCode”:”200”,”ErrorMsg”:”“,”Status”:”success”}
Post请求测试
MyVolleyRequest postRequest = new MyVolleyRequest(MyAPI.uploadImg, null, params, new VolleyResponseListener() { @Override public void onSuccessLoad(String string) { mDialog.dismiss(); Log.i("yqy", "post获取数据" + string); volleyRequestContent.setText(string); } @Override public void onFailedLoad(VolleyError error) { msg.obj = "请求服务器失败"; mDialog.dismiss(); handler.sendMessage(msg); } },null, "post"); VolleyApplication.getmLocalRequestQueue().add(postRequest);
输出结果: I/yqy: post获取数据{“Status”:”success”,”ErrorCode”:”200”,”ErrorMsg”:”未取到图片”,”Data”:”“}
图片上传
Map<String, String> params = new HashMap<>(); params.put("warId", "BV67HGP4GS"); params.put("tireId", "3009971551"); params.put("k2name", "s06600008ls"); List<File> files = new ArrayList<>(); String fileName=BitmapCompressUtils.compressImage(photoUri.getPath(),30); File f = new File(fileName); if (f != null) { Log.i("yqy", "文件名称" + f.getName()); files.add(f); } MyVolleyRequest uploadRequest = new MyVolleyRequest(MyAPI.uploadImg, null, new VolleyResponseListener() { @Override public void onSuccessLoad(String string) { mDialog.dismiss(); Log.i("yqy", "上传图片成功:" + string); } @Override public void onFailedLoad(VolleyError error) { mDialog.dismiss(); Log.i("yqy", "请求失败"+error.getMessage()); } }, params, files, "s06600008ls", null,"upload"); VolleyApplication.getmLocalRequestQueue().add(uploadRequest);
请求返回:
I/yqy: 上传图片成功:{“Status”:”success”,”ErrorCode”:”200”,”ErrorMsg”:”上传成功”,”Data”:”“}
最后,完整的一个Request
public class MyVolleyRequest extends Request<String> { private MultipartEntity entity ;//一些带有关文件参数和读取的类 private Map<String, String> header;//请求头信息 private VolleyResponseListener listener; private Response.Listener<String> mListener;//请求成功的监听 private Response.ErrorListener mErrorListener;//请求错误的监听 private String bodyContentType;//文件类型 private Map<String, String> params; private List<File> files; private String fileName;//文件组相关的参数名称 private int kVolleyTimeOutMS=20*1000;//超时时间 private int kVolleyMaxRetryNum =2;//超时重试时间 private Priority mPriority =Priority.NORMAL ;//设置优先级 public MyVolleyRequest(int method, String url, Response.ErrorListener listener) { super(method, url, listener); } public MyVolleyRequest(String url, VolleyResponseListener listener,Request.Priority priority,String tag) { this(Method.GET, url, listener.getmErrorListener()); this.listener = listener; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); if(priority!=null){ mPriority =priority; } setTagAndRetryPolicy(tag,kVolleyTimeOutMS,kVolleyMaxRetryNum); } public MyVolleyRequest(String url, Map<String, String> header,Map<String, String> params, VolleyResponseListener listener,Request.Priority priority,String tag) { this(Method.POST, url, listener.getmErrorListener()); this.listener = listener; this.header = header; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); this.params = params; if(priority!=null){ this.mPriority =priority; } setTagAndRetryPolicy(tag,kVolleyTimeOutMS,kVolleyMaxRetryNum); } //上传图片 public MyVolleyRequest(String url, Map<String, String> header, VolleyResponseListener listener, Map<String, String> params, List<File> files, String fileName,Request.Priority priority,String tag) { super(Method.POST, url, listener.getmErrorListener()); this.listener = listener; this.header = header; mListener = listener.getmListener(); mErrorListener = listener.getmErrorListener(); this.params = params; this.files = files; this.fileName = fileName; entity= new MultipartEntity(); bodyContentType =entity.getContentType().getValue(); buildMultipartEntity(); if(priority!=null){ this.mPriority =priority; } } //设置重试和tag public void setTagAndRetryPolicy(String tag,int timeOut,int maxRetryNum){ setTag(tag); setRetryPolicy(new DefaultRetryPolicy(timeOut, maxRetryNum, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); } @Override protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) { String parsed; try { parsed = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers)); } catch (UnsupportedEncodingException var4) { parsed = new String(networkResponse.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(networkResponse)); } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = super.getHeaders(); if (headers == null || headers.equals(Collections.emptyMap())) { if (header != null && !header.equals(Collections.emptyMap())) { headers = header; } else { headers = new HashMap<>(); } } return headers; } @Override public Priority getPriority() { Log.i("TTT",getTag()+"==="+mPriority); return mPriority; } //post请求,getparams一般不会调用,如果Request直接接触JsonRequest就会直接走getbody。但是你看源码就会发现,getbody中也会调用getParams() @Override public Map<String, String> getParams() { return params; } @Override public byte[] getBody() throws AuthFailureError { if(entity!=null){ //文件上传 ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { entity.writeTo(bos); return bos.toByteArray(); } catch (IOException e) { if(mErrorListener!=null){ mErrorListener.onErrorResponse(new ParseError()); } Log.e("Volley_qy","============IOException writing to ByteArrayOutputStream"); } } return super.getBody(); } @Override public String getBodyContentType() { if (bodyContentType == null || bodyContentType.equals("")) { bodyContentType = super.getBodyContentType(); } return bodyContentType; } @Override protected void deliverResponse(String s) { Log.i("Volley_qy",getPriority()+"请求成功返回的数据是:"+s); mListener.onResponse(s); } // 编辑上传文件和参数的加到entity中 private void buildMultipartEntity() { try { if (files != null && files.size() > 0) { for (File f : files) { FileBody fileBody = new FileBody(f,"image/jpeg"); entity.addPart(fileName, fileBody); } long fileLength = entity.getContentLength(); Log.i("Volley_qy", "上传文件的数目是:" + files.size() + ",上传文件的长度是: " + fileLength + " byte"); } if (params != null && params.size() > 0) { for (Map.Entry<String, String> entry : params.entrySet()) { Log.i("Volley_qy", "上传文件的参数是:(" + entry.getKey() + ":" + entry.getValue() + ")"); entity.addPart(entry.getKey(), new StringBody(entry.getValue())); } } } catch (UnsupportedEncodingException e) { VolleyLog.e("UnsupportedEncodingException"); } }}
以上,不对的地方请指出谢谢。
- Volley自定义一个Request
- volley 自定义 Request
- Volley(三) 自定义Request
- Volley自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley自定义Request(JSON)
- Android Volley 之自定义Request
- Volley使用技巧-----自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Android Volley 之自定义Request
- Volley以及自定义Request详解
- Android Volley 之自定义Request
- Android Volley之自定义request
- Android Volley 之自定义Request
- android Volley自定义request的方法
- Spring boot +Quartz +mongodb的分布式定时任务详解
- 类模板函数使用时实例化说明
- Logstash的KV模式自动将数字转换成整数
- 循环链表
- 手机号码,邮箱地址,正则表达式
- Volley自定义一个Request
- 卸载EOS Studio上SVN插件操作过程
- sql统计分组的组数
- 238. Product of Array Except Self
- php在linux上解析word文档
- maven全局配置文件settings.xml详解
- constexpr说明以及g++4.8.2实测分析
- ural 1880. Psych Up's Eigenvalues 贪心
- Socket PRGM: chat_p2p