一、volley是什么?

1、简单介绍

  Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。从名字由来和配图中无数急促的火箭能够看出 Volley 的特点:特别适合数据量小。通信频繁的网络操作。(个人觉得 Android 应用中绝大多数的网络操作都属于这样的类型)。

  Volley载入图片实现了两级缓存(网络缓存、文件缓存)。没有实现内存的缓存。Volley已经把各种异步任务、图片採样都封装好了。内存缓存使用lrucache类实现。须要我们手动增加进去。

没有使用软引用缓存。由于4.0之后的android系统已经不推荐使用软引用缓存了。

2、volley的整体设计

3、volley能够做什么

JSON,图像等的异步下载;
处理get、post等网络请求;
网络请求的排序(scheduling);
网络请求的优先级处理;
缓存;
多级别取消请求;
和Activity和生命周期的联动(Activity结束时同一时候取消全部网络请求);
等等。

它的设计目标就是很适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作。比方说下载文件等,Volley的表现就会很糟糕。

二、图片的三级缓存在volley中的实现

  事实上volley能够全然代替我们手写的三级缓存,由于google已经对volley进行了很好的封装,详细说明例如以下:

1、volley的推荐使用方法-单例模式

  使用volley时,我们推荐把volley的使用封装成单例使用。在application中初始化它。详细代码例如以下:

单例:

package com.ht.xiangqu.util;import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;/*** Created by annuo on 2015/6/16.*/
public class RequestManager {private static RequestManager ourInstance;private RequestQueue requestQueue;private ImageLoader imageLoader;public static RequestManager createInstance(Context context) {if (context != null) {if (ourInstance == null) {ourInstance = new RequestManager(context);} else {throw new IllegalArgumentException("Context must be set");}}return ourInstance;}public static RequestManager getInstance() {return ourInstance;}private RequestManager(Context context) {requestQueue = Volley.newRequestQueue(context);imageLoader = new ImageLoader(requestQueue,new ImageLoader.ImageCache() {private LruCache<String, Bitmap> cache= new LruCache<>(20);@Overridepublic Bitmap getBitmap(String url) {return cache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {cache.put(url, bitmap);}});}public RequestQueue getRequestQueue() {return requestQueue;}public ImageLoader getImageLoader() {return imageLoader;}}

application:

package com.ht.xiangqu.util;import android.app.Application;
import android.util.Log;/*** Created by annuo on 2015/6/16.*/
public class MainApplation extends Application {@Overridepublic void onCreate() {super.onCreate();RequestManager.createInstance(getApplicationContext());Log.d("nihao", "nihao");}
}

2、内存缓存

  仅仅有载入图片的时候才会有内存缓存,对于字符串一般都是之后文件缓存。

  google并没有自己主动的帮我们实现内存的缓存,须要我们自己手动增加进去。内存缓存在单例类中已经体现了(即LruCache),以后我们每次使用的时候都不必再增加内存缓存。LruCache这个类是Android3.1版本号中提供的。假设你是在更早的Android版本号中开发,则须要导入android-support-v4的jar包。

3、文件缓存

  volley已经默认帮我们实现了文件的缓存。

我们通过源码看一下:

    /*** Constructs a new ImageLoader.* @param queue The RequestQueue to use for making image requests.* @param imageCache The cache to use as an L1 cache.*/public ImageLoader(RequestQueue queue, ImageCache imageCache) {mRequestQueue = queue;mCache = imageCache;}

  以上代码是imageloader中的一段代码,从中我们能够看到在构造imageloader时,我们已经默认的建立了一个L1级的缓存(文件缓存)。

那volley缓存下来的文件究竟在哪呢?见下图:

  详细的位置就在如图所看到的的位置。即data/data/应用程序的包名/volley。假设没有改动volley的缓存位置。默认名字叫volley。

4、图片的二次採样的问题

  事实上volley默认的已经帮我们做了图片的二次採样,仅仅是须要我们在进行请求的时候,多增加两个參数。我们一般都忽略了这个问题,最后导致的是不断的OOM。

    /*** 这是訪问网络图片的核心方法* @param requestUrl* @param imageListener* @param maxWidth* @param maxHeight* @return*/public ImageContainer get(String requestUrl, ImageListener imageListener,int maxWidth, int maxHeight) {
        Request<?

> newRequest = new ImageRequest(requestUrl, new Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { onGetImageSuccess(cacheKey, response); } }, maxWidth, maxHeight, Config.RGB_565, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { onGetImageError(cacheKey, error); } }); mRequestQueue.add(newRequest); mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer)); return imageContainer; }

  以上代码是imageloader的核心方法,当中有两个參数是maxWidth,maxHeight。我们一般都忽略了这两个參数。默认值是0和0,这样二次採样算法就不起作用了。我们得到的图片是从server1:1哪来的。可是一般我们设置了这两个參数。就能够得到我们希望的缩小比例的图片。这样就能够全然的避免OOM。

三、volley的其它问题

1、圆角图片的问题

    public static ImageListener getImageListener(final ImageView view,final int defaultImageResId, final int errorImageResId) {return new ImageListener() {@Overridepublic void onErrorResponse(VolleyError error) {if (errorImageResId != 0) {view.setImageResource(errorImageResId);}}@Overridepublic void onResponse(ImageContainer response, boolean isImmediate) {if (response.getBitmap() != null) {//在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个//额外的參数view.setImageBitmap(response.getBitmap());} else if (defaultImageResId != 0) {view.setImageResource(defaultImageResId);}}};}

2、listview复用时,解决图片错位的问题

    /*** 使用此方法能够解决图片错乱问题* @param view* @param defaultImageResId* @param errorImageResId* @param url* @return*/public static ImageListener getImageListener(final ImageView view,final int defaultImageResId,final int errorImageResId,final String url) {return new ImageListener() {@Overridepublic void onErrorResponse(VolleyError error) {if (errorImageResId != 0) {view.setImageResource(errorImageResId);}}@Overridepublic void onResponse(ImageContainer response, boolean isImmediate) {if (response.getBitmap() != null) {//在这里能够设置,假设想得到圆角图片的画,能够对bitmap进行加工,能够给imageview加一个//额外的參数String urlTag = (String) view.getTag();if(urlTag!=null && urlTag.trim().equals(url)){view.setImageBitmap(response.getBitmap());}} else if (defaultImageResId != 0) {view.setImageResource(defaultImageResId);}}};}

四、volley的详细使用方法

  关于这块内容。网络上有许多的资料,总之volley使用起来很的简单。感兴趣的能够去网络上查找相关的资料进行学习。volley的载入速度绝对出乎你的意料。

——知道自己是谁。要什么。能跳多高。并且敢跳,并承受跳了可能失败的全部结果。

volley全然解析相关推荐

  1. Android Volley完全解析4:带你从源码的角度理解Volley

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17656437,CSDN 郭霖 经过前三篇文章的学习,Volley的用法我们已经掌握的差不 ...

  2. Android Volley完全解析3:定制自己的Request

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17612763,CSDN 郭霖 经过前面两篇文章的学习,我们已经掌握了Volley各种Re ...

  3. Android Volley完全解析2:使用Volley加载网络图片

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 在上一篇文章中,我们了解了Volley到底是什么,以及它的 ...

  4. Android Volley完全解析1:初识Volley的基本用法

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 1. Volley简介 我们平时在开发Android应用的 ...

  5. Android Volley完全解析(四),带你从源码的角度理解Volley

    经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚.因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地 ...

  6. Android Volley完全解析(二),使用Volley加载网络图片 转载:http://blog.csdn.net/guolin_blog/article/details/174

    转载:http://blog.csdn.net/guolin_blog/article/details/17482165 在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中 ...

  7. Android Volley完全解析(一),初识Volley的基本用法 转载地址:http://blog.csdn.net/guolin_blog/article/details/17482095

    转载地址:http://blog.csdn.net/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避免地都 ...

  8. Android Volley完全解析(一),初识Volley的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避 ...

  9. volley源代码解析(六)--HurlStack与HttpClientStack之争

    Volley中网络载入有两种方式,各自是HurlStack与HttpClientStack.我们来看Volley.java中的一段代码 if (stack == null) {//假设没有限定stac ...

最新文章

  1. R语言ggplot2可视化箱图(boxplot)时忽视异常值(outlier)并重新分配坐标轴的范围是的可视化的箱图可以有效显示箱体实战
  2. linux+C环境下动态管理头文件和库文件
  3. Sudo 授权需谨慎,否则脸上泪两行
  4. C#生成XSD规范,利用XmlSchema类
  5. 小波分析实验: 实验1 连续小波变换
  6. sklearn中的支持向量机SVC
  7. 项目不能上线,是开发的锅,还是产品的错?
  8. 低至1999元!罗永浩最后的“信仰之作”再降价,真香还是真惨
  9. 拼多多:扶贫项目正连续遭受网络舆情涉黑团伙攻击
  10. 〖Android〗屏幕触屏事件录制与回放
  11. Developer Zone Android*
  12. mysql的架构及查询sql的执行流程(一)
  13. 谷粒商城--分布式基础篇1
  14. struts1 和struts 2区别
  15. 网站接入QQ登录功能的实现
  16. DNS的作用是什么?为什么一定要配置DNS才能上网
  17. 谷歌、华盛顿大学联合研究:为什么在标准数据集上刷榜有问题
  18. 阿里云校验用户身份证信息是否是真实有效,姓名和身份证号是参数
  19. which java 找不到jdk_一、查看Jdk的安装路径:whereis javawhich java (java执行路径)echo $JAVA_HOMEecho $PATH备注:如...
  20. java自定义标签库的开发

热门文章

  1. Android的post()方法究竟运行在哪个线程中
  2. 精准 iOS 内存泄露检测工具
  3. ios笔记-单例文字代码详解
  4. webservice发布及远程调用
  5. linux远程复制文件命令小总结
  6. 在线手机号码提取工具
  7. Spring限定注入逻辑分组@Qualifier
  8. react native快速上手
  9. 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.40. Expat-2.1.0...
  10. 剑指OFFER之包含min函数的栈(九度OJ1522)