网络框架-Volley
来源:互联网 发布:夏普网络电视机 编辑:程序博客网 时间:2024/05/15 15:30
网络框架-Volley
Volley概述:
Volley是Google 2013年I/O大会推出的针对Android的HTTP网络请求框架,让网络请求更简单,更快。
特点:
- 自动调度网络请求
- 支持并发网络连接
- 支持标准的HTTP缓存协议(由服务器来决定是否缓存数据)
- 支持请求优先级设置
- 支持取消单个或多个请求
- 易于定制,扩展性强。比如Retry&Backoff机制
- 强大的网络请求能力让你轻松的发送异步请求来填充UI数据
- 提供调试和跟踪工具
优点:
擅长将RPC(远程过程调用协议,C/S模式)类型的操作,用来展示服务器数据。比如以某种数据格式获取一页搜索结果。支持任意的数据传输格式,比如图片,字符串,json,你也可以定义自己的数据格式。其实就是自定义Request。Volley让你不再写这些重复的模板代码(网络请求逻辑,不再重复造轮子),这样你就可以专注于你应用本身的业务逻辑.
缺点:
由于Volley都是在内存中解析和处理数据,所以不适合大数据量的下载操作。如果需要下载大文件,可以考虑使用系统的DownloadManager
注意事项:
- 如果自己编译Volley的话,compileSdkVersion需要<=22,直接使用Volley框架
- 如果大于等于22,需要引入:useLibrary “org.apache.http.legacy”,集成httpClinet的Api(这是因为在Android6.0中Google移除了httpClient相关的API)
- Volley仅适合用于通信频繁数据量小的网络操作
- 大数据量的网络操作并不适合Volley
基本使用
发送get请求
//获取最新博客列表String url = "http://www.oschina.net/action/api/blog_list?pageIndex=0&pageSize=20&type=latest";//构建请求队列RequestQueue requestQueue = Volley.newRequestQueue(this);//构建请求对象Request<? extends Object> request = new StringRequest(url, new Response.Listener<String>() {@Overridepublic void onResponse(String response) { Toast.makeText(GetActivity.this, "结果 = " + response, Toast.LENGTH_SHORT).show(); }}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) { Toast.makeText(GetActivity.this, "错误 = " + error, Toast.LENGTH_SHORT).show(); }});//添加到请求队列中,并执行请求requestQueue.add(request);
发送post请求
String url = "http://www.oschina.net/action/api/login_validate";//封装请求参数final Map<String, String> params = new HashMap<>();params.put("keep_login", "1");params.put("username", "xxx.com");params.put("pwd", "xxx");//构建请求队列RequestQueue requestQueue = Volley.newRequestQueue(this);//构建请求对象,并重写request内部方法getParams,设置请求参数Request<? extends Object> request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {@Overridepublic void onResponse(String response) { Toast.makeText(PostActivity.this, "登录成功 = " + response, Toast.LENGTH_SHORT).show(); }}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) { Toast.makeText(PostActivity.this, "登录失败 = ", Toast.LENGTH_SHORT).show(); }}) {@Overrideprotected Map<String, String> getParams() throws AuthFailureError { return params; }};//将请求对象添加到请求队列中,并执行请求requestQueue.add(request);
自定义请求对象(Request)
/** * 自定义Request */ private class MyRequest extends Request<String>{ private Response.Listener<String>mListener; private Map<String, String>params; private Map<String, String>headers; public MyRequest(int method, String url, Map<String, String> params, Map<String, String> headers, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; this.params = params; this.headers = headers; } //设置请求参数 @Override protected Map<String, String> getParams() throws AuthFailureError { if(params == null){ params = Collections.EMPTY_MAP; } return params; } //设置请求头信息 @Override public Map<String, String> getHeaders() throws AuthFailureError { if(headers == null){ headers = Collections.EMPTY_MAP; } return headers; } //处理响应结果 @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)); } //将响应结果分发给客户端 @Override protected void deliverResponse(String response) { mListener.onResponse(response); } }
自定义请求列队
DiskBasedCache diskBaseCache = new DiskBasedCache(getCacheDir(), 10 * 1024 * 1024); BasicNetwork newtwork = new BasicNetwork(new HurlStack()); //自定义请求队列 RequestQueue requestQueue = new RequestQueue( diskBaseCache,//缓存工具, 将请求的响应结果,进行缓存 newtwork ); //获取最新博客列表 String url = "http://www.oschina.net/action/api/blog_list?pageIndex=0&pageSize=20&type=latest"; Request<? extends Object> request = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Toast.makeText(RequestQueueActivity.this, "结果 = " + response, Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(RequestQueueActivity.this, "错误 = " + error, Toast.LENGTH_SHORT).show(); } });//添加到请求队列中requestQueue.add(request);//执行请求requestQueue.start();
上传文件
String url = "http://www.oschina.net/action/apiv2/resource_image"; RequestQueue requestQueue = Volley.newRequestQueue(this); Map<String, Object> params = new HashMap<>();params.put("resource", new File(Environment.getExternalStorageDirectory().getPath() + "/bear.png")); MultipartRequest multipartRequest = new MultipartRequest( url, null, params, new Response.Listener<String>(){ @Override public void onResponse(String response) { Toast.makeText(PostActivity.this, "登录成功 = " + response, Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { Toast.makeText(PostActivity.this, "登录失败 = ", Toast.LENGTH_SHORT).show(); } } );requestQueue.add(multipartRequest);//这里需要自定义MultipartRequestpublic class MultipartRequest extends Request<String> { private MultipartEntity entity; private final Response.Listener<String>mListener; private List<Part>partList = new ArrayList<Part>(); private Map<String, String>mHeaders; public MultipartRequest(String url, Response.ErrorListener errorListener,// Response.Listener<String> listener,// Map<String, Object> params,// Map<String, String> headers ) { super(Method.POST, url, errorListener); mHeaders = headers; mListener = listener; if (params != null && params.size() >0) { for (Map.Entry<String, Object> entry : params.entrySet()) { String key = entry.getKey(); Object o = entry.getValue(); if (o instanceof File) { try { partList.add(new FilePart(key, (File) o)); } catch (FileNotFoundException e) { e.printStackTrace(); } } else { partList.add(new StringPart(key, (String) o)); } } } buildMultipartEntity(); } private void buildMultipartEntity() { try { entity = new MultipartEntity(partList.toArray(new Part[partList.size()])); } catch (Exception e) { VolleyLog.e("UnsupportedEncodingException"); } } @Override public String getBodyContentType() { return entity.getContentType().getValue(); } @Override public byte[] getBody() throws AuthFailureError { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { entity.writeTo(bos); } catch (IOException e) { VolleyLog.e("IOException writing to ByteArrayOutputStream"); } return bos.toByteArray(); } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); ALog.d(parsed); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } /* * (non-Javadoc) * * @see com.android.volley.Request#getHeaders() */ @Override public Map<String, String> getHeaders() throws AuthFailureError { if (mHeaders == null || mHeaders.equals(Collections.emptyMap())) { mHeaders = new HashMap<String, String>(); } return mHeaders; } @Override protected void deliverResponse(String response) { mListener.onResponse(response); }
自我感觉好繁琐...
阅读全文
0 0
- 网络请求框架---Volley
- 网络通信框架Volley
- Volley网络框架详解
- Android网络框架Volley
- Android网络框架Volley
- Android网络框架Volley
- Andoid 网络框架--Volley
- 网络框架Volley
- android 网络框架 volley
- android Volley网络框架
- 12.网络框架volley
- Volley网络请求框架
- Android网络框架Volley
- 网络请求框架---Volley
- 网络请求框架-Volley
- Android网络框架Volley
- volley网络框架
- Volley-----网络请求框架
- C语言中| 按位或, || 逻辑或。
- FAT16文件系统之FAT表浅谈(三)
- android 8种对话框(Dialog)使用方法汇总
- busybox制作根文件系统
- 分数加减法
- 网络框架-Volley
- 静态查找表与动态查找表
- C++中for循环的5种语法
- Tensorflow深度学习之九:滑动平均模型
- bzoj3926[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
- LeetCode 645 : Set Mismatch(java)
- Thinkphp5学习(33)验证码
- 暑期集训sort
- vim放大缩小