关闭

Volley缓存机制

标签: Volley缓存机制LruCache二级缓存ImageLoade
912人阅读 评论(2) 收藏 举报
分类:

Volley简介

    Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作。

    Volley加载JsonObjectRequest数据、StringRequest数据、ImageRequest图片数据仅仅实现了两级缓存(网络缓存、文件缓存),没有实现内存的缓存。Volley已经把各种异步任务、图片采样都封装好了。

    内存缓存使用lrucache类实现,需要我们手动添加进去。没有使用软引用缓存。因为4.0之后的android系统已经不推荐使用软引用缓存了。

Volley请求数据原理图
这里写图片描述

这里写图片描述

Volley缓存机制

    volley发起一个请求先从缓存中去查找,如果缓存有数据,直接返回结果,如果没有缓存中没有数据,volley会发起网络请求,此时展示数据,同时将网络获取的数据保存到缓存中。
    那咱们看一下缓存数据在哪里:想要使用Volley请求数据,必须要获取RequestQueue这个对象,Volley提供了公共静态的方法:newRequestQueue(Context context)
public static RequestQueue newRequestQueue(Context context) {
        return newRequestQueue(context, null);
    }

该方法中返回了:return newRequestQueue(context, null); 接续跟着代码走

public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
        File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

        String userAgent = "volley/0";
        try {
            String packageName = context.getPackageName();
            PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
            userAgent = packageName + "/" + info.versionCode;
        } catch (NameNotFoundException e) {
        }

        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                stack = new HurlStack();
            } else {
                // Prior to Gingerbread, HttpUrlConnection was unreliable.
                // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

        Network network = new BasicNetwork(stack);

        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
        queue.start();

        return queue;
    }
    此时我们发现,缓存的地址: File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);也就是默认的缓存地址是程序安装包下的data/data/中,接下来看一下RequestQueue的构造方法说明,继续看源码
/**
     * Creates the worker pool. Processing will not begin until {@link #start()} is called.
     *
     * @param cache A Cache to use for persisting responses to disk
     * @param network A Network interface for performing HTTP requests
     */
    public RequestQueue(Cache cache, Network network) {
        this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE);
    }

从源码注释中cache A Cache to use for persisting responses to disk我们知道缓存其实是放到SD卡中了,并没有实现内存缓存即并没有实现LruCache

Volley内存缓存

    只有加载图片的时候才会有内存缓存,对于字符串一般都是文件缓存。我们学习一下ImageLoader,内存缓存的实现
    ImageLoader构造方法:
/**
     * 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;
    }
    参数一是RequestQueue,其中可以指定文件缓存地址,我们通过单例模式创建RequestQueue这个类,就可以将文件缓存路径指定到SD卡上
    参数二是内存缓存,这个类是接口需要实现其中方法
/**
     * Simple cache adapter interface. If provided to the ImageLoader, it
     * will be used as an L1 cache before dispatch to Volley. Implementations
     * must not block. Implementation with an LruCache is recommended.
     */
    public interface ImageCache {
        public Bitmap getBitmap(String url);
        public void putBitmap(String url, Bitmap bitmap);
    }

给大家一个实例代码:

ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() {
//            内存缓存
            int maxSize = (int) (Runtime.getRuntime().totalMemory()/8);

            LruCache<String,Bitmap> mLruCache = new LruCache<String,Bitmap>(maxSize){

//              告诉LruCache存入的数据多大
                @Override
                protected int sizeOf(String key, Bitmap value) {
//                    存入每张图片的大小
                    return value.getRowBytes()*value.getHeight();
                }
            };

//            缓存中获取数据
            @Override
            public Bitmap getBitmap(String url) {
                return mLruCache.get(url);
            }

//            第一次使用,肯定没有数据,联网请求,将数据存起来,方便以后使用
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                mLruCache.put(url,bitmap);
            }
        };

对于请求图片的ImageLoader,这个类请求图片的机制是这样的,就是一个经典的三级缓存了:
1、当ImageLoader发起图片请求时,先从内存缓存LruCache中根据key(即请求url)获取缓存数据,如果有数据,直接返回数据,不进行其他操作了

2、如果内存缓存中没有数据,ImageLoader中第一参数requestQueue就会先从文件缓存中查找是否存在数据,如果有数据,直接返回数据,不进行联网操作了

3、如果文件缓存中么有数据,那就只能进行联网操作,联网操作获取数据, Volley会根据这个请求是否设置缓存进行缓存与否,将数据返回

3
0
查看评论

谷歌Volley网络框架分析。(四)缓存机制

1.缓存使用前提: 服务器必须支持,缓存,配置Cache-Control等头信息,因为Volley需要从这些头信息判断缓存是否已经过期。如果已经过期Volley将会重新从网络获取数据。     Request.setShouldCache(true)将开启缓存。 2.缓存流程...
  • wo6925371
  • wo6925371
  • 2013-12-04 16:24
  • 9061

从源码带看Volley的缓存机制

Volley已默认使用磁盘缓存DiskBasedCache内部结构它由两部分组成,一部分是头部,一部分是内容;先得从它的内部静态类CacheHeader(缓存的头部信息)讲起,先看它的内部结构...
  • asdzheng
  • asdzheng
  • 2015-05-24 21:03
  • 4254

Android volley 解析(四)之缓存篇

这是 volley 的第四篇 blog 了,写完这篇,volley 的大部分用法也都算写了一遍,所以暂时不会写 volley 的文章了,如果想看我前面写的文章,可以点这里 Android volley 解析(三)之文件上传篇为什么要用缓存我们知道,当客户端在请求网络数据的时候,是需要消耗流量的...
  • jxxfzgy
  • jxxfzgy
  • 2015-03-07 08:56
  • 8761

Android中关于Volley的使用(八)缓存机制的深入认识

有一个朋友在私信里问我, 1)Volley可以在SD卡中缓存图片,那可不可以在SD卡中缓存Json数据呢? 2)如果断网了,Volley是不是就不能用了,存在SD卡中的数据是不是就用不了了? 在Volley中,默认使用的缓存实现是 DiskBasedCache,在创建RequestQueue的时候,...
  • foolsheep
  • foolsheep
  • 2014-04-06 12:31
  • 11175

Volley HTTP 缓存机制

Volley HTTP 缓存规则在介绍Volley的HTTP缓存机制之前,我们首先来看一下HTTP HEADER中和缓存有关的字段有: 规则 字段 示例值 类型 作用 新鲜度 Expires Sat, 23 Jul 2016 03:34:17 GMT 响应 告诉...
  • zinss26914
  • zinss26914
  • 2016-05-30 20:05
  • 5524

Volley的缓存机制

从源码带看Volley的缓存机制,volley缓存 热度4 评论 55 www.BkJia.Com  网友分享于:  2015-05-26 09:05:07     浏览数38352...
  • u014538437
  • u014538437
  • 2015-10-12 15:04
  • 393

Volley Http缓存机制

https://www.path8.net/tn/archives/2745 //如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从...
  • github_36104340
  • github_36104340
  • 2016-11-23 20:45
  • 112

Volley Cache缓存机制

http://item.congci.com/item/volley-cache-huancun-jizhi 1.http缓存机制 要弄明白volley缓存机制,那么肯定是和浏览器的缓存机制有关了,简单来说volley整套框架要做的事都是模拟浏览器来进行一次次的http交互 1.1...
  • szlcw1
  • szlcw1
  • 2015-05-17 23:24
  • 576

volley的特点

volley主要用来处理数据量不大但很频繁的请求。 volley的几个重要的特点: 1,通信速度快,代码简单,而且相对来说比较稳定。对于我们开发者来说,效率会很高。 2,get、post请求和图像处理的异步性。发送网络请求时需要在工作线程发送,而volley帮助我们启用了工作线程,简化我们...
  • mortal_li
  • mortal_li
  • 2016-01-30 13:21
  • 503

Volley扩展——文件断点下载(支持下载进度)

volley同样不适合大文件的下载,只能自己扩展了,我这里参考了Netroid,有兴趣的可以去分析下,文件下载模仿了图片的加载方式,添加了两个类分别是FileDownloadRequest和FileDownloader。
  • s569646547
  • s569646547
  • 2015-09-10 18:14
  • 6958
    个人资料
    • 访问:46392次
    • 积分:879
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:3篇
    • 译文:0篇
    • 评论:13条
    最新评论