Android的volley框架心得
来源:互联网 发布:windows资源管理器占用 编辑:程序博客网 时间:2024/05/17 01:12
小弟很懒,不喜欢写这些总结,主要是表达能力有限,如果想一起交流volley相关的,可以看看我的github
Volley
https://github.com/bacy/volley
大家一起学习进步
1. Volley中添加url参数和表单
请求中添加Url参数,需要自己拼接字符串,或者重写getUrl方法
StringBuilder sb = new StringBuilder(); if (!url.contains("?")) { url = url + "?"; } else { if (!url.endsWith("?")) { url = url + "&"; } } Iterator<String> iterotor = paramsMap.keySet().iterator(); while (iterotor.hasNext()) { String key = (String) iterotor.next(); try { sb.append(key).append("=").append(URLEncoder.encode(paramsMap.get(key), "utf-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } if (sb.lastIndexOf("&") == sb.length() - 1) { sb.deleteCharAt(sb.length() - 1); }
post中添加参数
重写Requst的getParams方法,或者自定义request
@Override protected Map<String, String> getParams() throws AuthFailureError { ParamsEngine engine = new ParamsEngine(mContext); Map<String, String> p = engine.generateRequestParams(paramsMap); return p; }
2. Volley加载本地图片
Volley本身只能处理网络请求,缓存网络请求。但是其request和response的架构同样适用于异步加载本地和本地文件。所有网络请求的获取,全部交给了BasicNetwork.它是Volley的核心,在performRequest这个方法中,将所有request转换为相应的response,交给NetworkDispatcher来调度。我们只需要对request的url进行判断。如果是/或者file开头的,通通作为本地文件处理,使用本地解析流的方式放回response,同时把request中的shouldCahce设为false,因为本地文件已经存在本地,不再需要缓存到volley的缓存文件中,代码如下:
String urlString = request.getUrl(); if(urlString.trim().toLowerCase().startsWith("file")){ try { // 如果加载的是本地图片,不放入disk-cache目录中 request.setShouldCache(false); return new NetworkResponse(getFromFile(new URI(urlString).getPath())); } catch (URISyntaxException e) { e.printStackTrace(); } }else if(urlString.trim().toLowerCase().startsWith("/")){ request.setShouldCache(false); return new NetworkResponse(getFromFile(urlString)); }
其中getFromFile方法,就是把file转换成字节数组,可以参照volley中转换entity的方法
private byte[] getFromFile(String urlString) throws IOException { File file = new File(urlString); PoolingByteArrayOutputStream bytes = new PoolingByteArrayOutputStream(mPool, (int) file.length()); byte[] buffer = null; // 得到文件的输入流 InputStream in = null; try { buffer = mPool.getBuf(1024); in = new FileInputStream(new File(urlString)); int count; while ((count = in.read(buffer)) != -1) { bytes.write(buffer, 0, count); } return bytes.toByteArray(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } mPool.returnBuf(buffer); try { bytes.close(); } catch (IOException e) { e.printStackTrace(); } } }
这里使用ByteArrayPool来避免反复申请byte[]数组空间
3. Volley中DiskBasedCache初始化非常慢的问题。
initialize方法中,遍历所有的缓存文件,读取头信息存入map中,当缓存文件非常多的时候,google提供的初始化实现,耗费了10s以上的时间!!!不知道这是不是个bug。也就是说,每次newRequestQueue,都需要等待十秒的时间才能开始处理request。如果这样的话,这个框架就没法用了。
目前我也没找到好的方法。有两个优化方案。
(1) 有人在stackoverflow中提到过这个问题,然后他给出了解决方案。在initialize中,给FileOutputStream在套一层BufferedOutputStream。本人测试过,速度有十倍的提升。基本能控制初始化的时间在1-3s。
(2) 提前初始化。每一次newRequestQueue都要花费这么长时间初始化,但是实际使用中,我们需要new那么多RequestQueue吗?看源代码可以知道,每个RequestQueue实际启动了5个循环线程来调度各种请求。其中四个用来处理网络请求,一个用来处理cache请求。对于一个app来说,这样已经足够,我们没必要每个页面都启动一个RequestQueue。因此,我把RequestQueue设置为单例,在Application中初始化,这样就可以避免initialize被反复调用,同时也能在界面出来之前,预先准备好数据
1 0
- Android的volley框架心得
- android的volley框架
- android的volley框架
- Volley框架关于RequestQueue的心得
- Android Volley 框架的使用
- Android Volley 框架的使用
- Android Volley框架的使用
- Android Volley 框架的使用
- android的volley框架使用日志1
- android http 框架volley 的学习 。。
- 【Android】Volley框架的使用简介
- Android Volley 框架的使用(一)
- Android Volley框架的使用(二)
- Android Volley框架的使用(三)
- Android网络框架Volley的快速使用
- Android 网络通信框架Volley的解析
- Android网络请求框架Volley的使用
- Android中google volley框架的使用
- 苏飞论坛
- 从域名获取IP地址
- uva 10100 Longest Match(最长公共子序列)
- 关于Vector作为函数的返回值
- 【编程拾遗】预编译头文件来自编译器的早期版本
- Android的volley框架心得
- 第一章:初识lucene
- 经销商导入存储过程(oracle)
- iOS更改NavigationBar Title颜色字体
- 对图中一些概念的区分
- ADB常用命令笔记
- 实现实现易信的圆形图像和对话列表的图像显示部分
- Android Toolbar跟随ListView滑动隐藏和现实
- jQuery在线手册