题记——

人来到这个世界上,只有两件事情,生与死,

一件事完了,另一件事还急什么?

有缘而来,无缘而去,

识自本心,见自本性

不起妄缘,无心无为

自由自在,动静自如

冷暖自知,则是修行

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网络请求框架(三)相关推荐

  1. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

  2. NoHttp使用简析——Android网络请求框架(二)

    题记-- 静坐窗前,与明月为伴. 每一天都是一个新的开始,每一天都是一个新的心态,每一天的目标都是品好每一杯白开水. 生活的价值是活的有意义,而活的有意义就是生命的折腾. 在功夫的世界中,唯快不破,在 ...

  3. Okhttp使用简析——Android网络请求框架(一)

    题记-- 慢慢地,我们都会变老,从起点走向终点,自然而必然,成长的途中,匆匆而又忙忙,跌跌而又撞撞,奔波而双小心,劳累而又费心,一生,留下什么,又得到什么,人生的脆弱和坚强都超乎自己的想象,看淡心境, ...

  4. 《Android 网络开发与应用实战详解》——2.1节简析Android安装文件

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.1节简析Android安装文件,作者 王东华,更多章节内容可以访问云栖社区"异步社区" ...

  5. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  6. MTK IMS框架简析(2)——IMS注册过程

    之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...

  7. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.1节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.1节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  8. DirectX游戏开发之代码的框架简析

    DirectX游戏开发之代码的框架简析 此次学习过程中,主要参考的是大神"毛星云"的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改. 在这两个上面你能够学得更 ...

  9. 网络协议:简析三次握手协议

    一,简析三次握手协议 首先来看我们生活中很常见的一件事: 在我们网购的时候,常常会跟客服这样聊天:我们向客服询问某件事,客服回答,然后我们断网了...过了一会儿,我们再登陆就收到了客服的回答. 这个交 ...

最新文章

  1. vue - 减少打包后的体积
  2. hdoj1087 (DP--LIS)
  3. 【Python】itertools之product函数
  4. hbase安装配置(整合到hadoop)
  5. SAS在金融中的应用七
  6. php本机绿色调试,php本地调试工具下载|
  7. 搜狗浏览器收藏夹在哪_搜狗浏览器居然流氓到操作我的微博账号
  8. 一个很好用的JavaScript的文件上传插件plupload
  9. c++中的enum类
  10. 十大你不一定知道的牛逼技术问答社区
  11. Word文档《Document SAFER 2》
  12. vfp程序设计和c语言6,VFP程序设计总结
  13. 微信公众号开发框架 For Java —— wechatapi
  14. Win10 利用快捷键,快速新建TXT文档
  15. android Activity设置透明主题样式方法
  16. mtk 耳机accdet检测驱动分析
  17. 留学生 电脑安全与维护手册 (留学须知)
  18. cie1931 python绘制_科学网-gnuplot与CIE1931 XYZ三刺激值曲线-范学良的博文
  19. 虚拟机VMware安装Ubuntu记录
  20. CSDN Blogger小工具

热门文章

  1. CVPR 2020 Oral | 旷视提出目前最好的密集场景目标检测算法:一个候选框,多个预测结果...
  2. 云智视像 | 内推两个年薪可达70万+的CV算法职位~base杭州上海
  3. python入门需要有什么基础?
  4. 目前游戏建模公司大多开出高薪,以期能够留住人才,吸纳更多人才
  5. mysql聚合索引跟非聚合索引的区别_聚集索引和非聚集索引的区别有哪些
  6. 展望 | 2020年人工智能八大趋势
  7. 资源下载| 机器学习经典书籍《统计学习方法》(Python3.6)代码实现(及课件)
  8. 三次样条曲线拟合及Matlab/Python实现
  9. python计算复制比_vbs实现只复制比目标文件更新的文件
  10. java压栈重复字符串_Java 实例 – 压栈出栈的方法实现字符串反转