Volley网络请求框架简析——Android网络请求框架(三)
题记——
人来到这个世界上,只有两件事情,生与死,
一件事完了,另一件事还急什么?
有缘而来,无缘而去,
识自本心,见自本性
不起妄缘,无心无为
自由自在,动静自如
冷暖自知,则是修行
1、初始化一个消息请求队列以及网络请求工具类对象
/*** Created by androidlongs on 16/7/1.* 网络请求访问框架*/
public class VollyRequestUtils {/*** Volley框架使用工具类对象*/private static VollyRequestUtils vollyRequestUtils;/*** 网络消息请求队列*/private static RequestQueue requestQueue;private VollyRequestUtils() {/*** 初始化请求消息队列*/getVolleyQueyInstanse();}/*** 获取消息工具类请求对象实体** @return*/public static VollyRequestUtils getInstance() {if (vollyRequestUtils == null) {synchronized (VollyRequestUtils.class) {if (vollyRequestUtils == null) {vollyRequestUtils = new VollyRequestUtils();}}}return vollyRequestUtils;}/*** 获取消息请求队列*/public void getVolleyQueyInstanse() {if (requestQueue == null) {synchronized (VollyRequestUtils.class) {if (requestQueue == null) {requestQueue = Volley.newRequestQueue(App.getContext());}}}}}
备注说明:
这里采用单例设计模式,其中创建请求消息队列 requestQueue传入的是一个Application对象
public class App extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = this;}public static Context getContext(){return context;}
}
切记要在程序的清单文件中引入
2、Get网络请求返回String
/*** get 请求** @param url 网络请求url* @param netTag 网络请求标识* @param isCache 设置缓存标识* @param listener 请求成功回调* @param errorlistener 请求失败回调*/public void asyGetStringRequest(String url, String netTag, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorlistener) {/*** 在发起请求前先取消队列中有此标签的网络,避免多次重复请求问题*/requestQueue.cancelAll(netTag);/*** 获取请求对象* 并设置相关的监听*/StringRequest request = new StringRequest(Request.Method.GET, url, listener, errorlistener);/*** 设置网络请求标识*/request.setTag(netTag);/*** 设置网络请求缓存*/request.setShouldCache(isCache);/*** 添加到队列中*/requestQueue.add(request);}
使用方法:
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";final String netTag = "getString";VollyRequestUtils.getInstance().asyGetStringRequest(url, netTag, false, new Response.Listener<String>() {@Overridepublic void onResponse(String s) {System.out.println("get String success " + s);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError volleyError) {System.out.println("get String onErrorResponse " + volleyError.getMessage());}});
3、POST请求提交参数形式为KEY - VALUE 形式请求
/*** post请求 提交KEY - VALEU 形式的数据** @param url* @param netTag* @param map* @param isCache* @param listener* @param errorListener*/public void asyncPostStringQuest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorListener) {/*** 取消此标识下的所有网络请求,避免重复提交*/requestQueue.cancelAll(netTag);/*** 获取Request对象 并封装相应的参数*/StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {@Overrideprotected Map<String, String> getParams() throws AuthFailureError {/*** 封装请求参数*/if (map != null && !map.isEmpty()) {return map;} else {return super.getParams();}}};/*** 设置缓存*/request.setShouldCache(isCache);/*** 设置网络请求标识*/request.setTag(netTag);requestQueue.add(request);}
使用方法:
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";final String netTag = "postString";Map<String, String> map = new HashMap<>();map.put("username", "postUsername");map.put("password", "postPassword");VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener<String>() {@Overridepublic void onResponse(String s) {System.out.println("post String success " + s);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError volleyError) {System.out.println("post String onErrorResponse " + volleyError.getMessage());}});}
4、post请求提交参数为JSON形式
/*** 提交 JSON数据到服务器** @param url 网络请求URL* @param netTag 网络请求标识* @param map 网络请求提交参数* @param isCache 缓存请求标识* @param listener 成功监听* @param errorListener 失败监听*/public void asynePostJsonObjRequest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {requestQueue.cancelAll(netTag);/*** 封装参数*/JSONObject object = new JSONObject();try {if (map != null && !map.isEmpty()) {for (Map.Entry<String, String> entry : map.entrySet()) {object.put(entry.getKey(), entry.getValue());}}} catch (Exception e) {e.printStackTrace();}/*** 创建请求Request*/JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object, listener, errorListener);/*** 设置网络请求标识*/jsonObjectRequest.setTag(netTag);/*** 设置缓存*/jsonObjectRequest.setShouldCache(isCache);requestQueue.add(jsonObjectRequest);}
使用方法:
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";final String netTag = "postString";Map<String, String> map = new HashMap<>();map.put("username", "postUsername---45");map.put("password", "postPassword---45");VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener<JSONObject>(){@Overridepublic void onResponse(JSONObject jsonObject) {JSONObject j = jsonObject;}},new Response.ErrorListener(){@Overridepublic void onErrorResponse(VolleyError volleyError) {}});
5、加载图片请求
/*** 加载图片请求* @param url 加载图片的URL* @param netTag 加载图片的网络请求标识* @param imageMaxWidth 加载图片的最大宽度* @param imageMaxHeight 加载图片的最大高度* @param listener 加载成功监听* @param errorListener 加载失败监听*/public void asyPostImageRequest(String url, String netTag, int imageMaxWidth, int imageMaxHeight, Response.Listener<Bitmap> listener, Response.ErrorListener errorListener) {requestQueue.cancelAll(netTag);/*** 创建获取request* 并设置相关的监听与参数*/ImageRequest request = new ImageRequest(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX, Bitmap.Config.ARGB_8888, errorListener);/*** 设置加载缓存*/request.setShouldCache(true);/*** 设置网络请求标识*/request.setTag(netTag);/*** 设置请求超时时间*/request.setRetryPolicy(new DefaultRetryPolicy(15000,3000,3000));requestQueue.add(request);}
使用方法
final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";final String netTag = "imagerequest";VollyRequestUtils.getInstance().asyPostImageRequest(url, netTag, screeWidht, screeHeight, new Response.Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap bitmap) {System.out.println("image request success ");if (bitmap != null) {imageView.setImageBitmap(bitmap);}}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError volleyError) {System.out.println("image request faile ");}});
6、使用Volley内置ImageLoader 加载图片
/*** 加载多张图片** @param url* @param imageView* @param imageMaxWidth* @param imageMaxHeight*/public void asyVolleyImageLoaderRequest(String url, ImageView imageView, int imageMaxWidth, int imageMaxHeight) {ImageLoader imageLoaderInstance = getImageLoaderInstance();// getImageListener(imageView控件对象,默认图片地址,失败图片地址);ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);// get(图片地址,listener,宽,高);自动帮你处理图片的宽高再也不怕大图片的oom了imageLoaderInstance.get(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX);}private static ImageLoader imageLoader;/*** 获取 Imageloader对象 * @return*/private ImageLoader getImageLoaderInstance() {if (imageLoader == null) {synchronized (VollyRequestUtils.class) {if (imageLoader == null) {imageLoader = new ImageLoader(requestQueue, new BitmapLruCache());}}}return imageLoader;}
使用方法
final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";final String netTag = "postString";VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);
在这里使用到了一个缓存对象类
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {/*** LruCache 原理:Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。 * 当cache已满的时候加入新的item时,在队列尾部的item会被回收。* 解释:当超出指定内存值则移除最近最少用的图片内存*/public static int getDefaultLruCacheSize() {// 拿到最大内存final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);// 拿到内存的八分之一来做图片内存缓存final int cacheSize = maxMemory / 8;return cacheSize;}public BitmapLruCache() {this(getDefaultLruCacheSize());}public BitmapLruCache(int sizeInKiloBytes) {super(sizeInKiloBytes);}@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getRowBytes() * value.getHeight() / 1024;}@Overridepublic Bitmap getBitmap(String url) {return get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {put(url, bitmap);}}
7、使用Volley提供的NetworkImageView加载图片
布局文件中的xml中使用方法
<com.android.volley.toolbox.NetworkImageViewandroid:layout_marginTop="10dp"android:id="@+id/network_image_view"android:layout_width="100dp"android:layout_height="100dp" />
java代码中的操作
/*** 这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题,而且NetworkImageView还会根据你对图片设置的width和heigh自动压缩该图片不会产生多的内存,还有NetworkImageView在列表中使用不会图片错误** @param iv* @param url*/private void networkImageViewUse(NetworkImageView iv, String url) {ImageLoader imLoader = new ImageLoader(Volley.newRequestQueue(App.getContext()), new BitmapLruCache());iv.setDefaultImageResId(android.R.drawable.ic_menu_rotate);iv.setErrorImageResId(android.R.drawable.ic_delete);iv.setImageUrl(url, imLoader);}
8、自定义Request请求
Volley网络请求框架简析——Android网络请求框架(三)相关推荐
- Retrofit网络请求框架使用简析——Android网络请求框架(四)
题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...
- NoHttp使用简析——Android网络请求框架(二)
题记-- 静坐窗前,与明月为伴. 每一天都是一个新的开始,每一天都是一个新的心态,每一天的目标都是品好每一杯白开水. 生活的价值是活的有意义,而活的有意义就是生命的折腾. 在功夫的世界中,唯快不破,在 ...
- Okhttp使用简析——Android网络请求框架(一)
题记-- 慢慢地,我们都会变老,从起点走向终点,自然而必然,成长的途中,匆匆而又忙忙,跌跌而又撞撞,奔波而双小心,劳累而又费心,一生,留下什么,又得到什么,人生的脆弱和坚强都超乎自己的想象,看淡心境, ...
- 《Android 网络开发与应用实战详解》——2.1节简析Android安装文件
本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.1节简析Android安装文件,作者 王东华,更多章节内容可以访问云栖社区"异步社区" ...
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...
- MTK IMS框架简析(2)——IMS注册过程
之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.1节简析Android安装文件...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.1节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...
- DirectX游戏开发之代码的框架简析
DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...
- 网络协议:简析三次握手协议
一,简析三次握手协议 首先来看我们生活中很常见的一件事: 在我们网购的时候,常常会跟客服这样聊天:我们向客服询问某件事,客服回答,然后我们断网了...过了一会儿,我们再登陆就收到了客服的回答. 这个交 ...
最新文章
- vue - 减少打包后的体积
- hdoj1087 (DP--LIS)
- 【Python】itertools之product函数
- hbase安装配置(整合到hadoop)
- SAS在金融中的应用七
- php本机绿色调试,php本地调试工具下载|
- 搜狗浏览器收藏夹在哪_搜狗浏览器居然流氓到操作我的微博账号
- 一个很好用的JavaScript的文件上传插件plupload
- c++中的enum类
- 十大你不一定知道的牛逼技术问答社区
- Word文档《Document SAFER 2》
- vfp程序设计和c语言6,VFP程序设计总结
- 微信公众号开发框架 For Java —— wechatapi
- Win10 利用快捷键,快速新建TXT文档
- android Activity设置透明主题样式方法
- mtk 耳机accdet检测驱动分析
- 留学生 电脑安全与维护手册 (留学须知)
- cie1931 python绘制_科学网-gnuplot与CIE1931 XYZ三刺激值曲线-范学良的博文
- 虚拟机VMware安装Ubuntu记录
- CSDN Blogger小工具
热门文章
- CVPR 2020 Oral | 旷视提出目前最好的密集场景目标检测算法:一个候选框,多个预测结果...
- 云智视像 | 内推两个年薪可达70万+的CV算法职位~base杭州上海
- python入门需要有什么基础?
- 目前游戏建模公司大多开出高薪,以期能够留住人才,吸纳更多人才
- mysql聚合索引跟非聚合索引的区别_聚集索引和非聚集索引的区别有哪些
- 展望 | 2020年人工智能八大趋势
- 资源下载| 机器学习经典书籍《统计学习方法》(Python3.6)代码实现(及课件)
- 三次样条曲线拟合及Matlab/Python实现
- python计算复制比_vbs实现只复制比目标文件更新的文件
- java压栈重复字符串_Java 实例 – 压栈出栈的方法实现字符串反转