天天看点

【第五篇】Volley代码修改之图片二级缓存以及相关源码阅读(重写ImageLoader.ImageCache)

有讲到使用LRU来处理缓存的,但是只是处理内存里面的缓存,没进行文件缓存和处理,那么如何实现Volley在本地的缓存呢

一般硬盘缓存使用com.jakewharton.disklrucache.DiskLruCache这个Lru缓存,具体代码在

<a href="https://github.com/JakeWharton/DiskLruCache/tree/master/src%EF%BC%8C%E9%87%8C%E9%9D%A2%E4%B8%BB%E8%A6%81%E6%98%AF%E8%BF%99%E4%B8%89%E4%B8%AA%E7%B1%BB%EF%BC%9A">https://github.com/JakeWharton/DiskLruCache/tree/master/src,里面主要是这三个类:</a>

重写ImageCache实现图片二级缓存L2LRUImageCache.java

接下来考虑Volley正常加载图片时怎么加载的,如下:

那么调用L2LRUImageCache 进行二级缓存和缓存文件读取并加载到组件上面的逻辑也就在重写imageLoader的逻辑里面:

原生的volley里面 imageLoader.get(string, listener);进入如下代码

其中throwIfNotOnMainThread为检查是否在主线程,代码如下:

可见Imageloader加载图片必须运行在主线程。

然后getCacheKey获取key信息:如下解释是为1级缓存创建缓存key,创建方法如代码所述:

Bitmap cachedBitmap = mCache.getBitmap(cacheKey)然后就是去1级缓存里面去都去缓存内容:

如下ImageCache是个接口,推荐使用LRUCache来实现1级缓存:

如果1级缓存不为null,就cachedBitmap回调给图片加载的response;

如果1级缓存为null的话,就去加载默认图片:

其中imageListener携带加载失败和默认图片的设置信息.

后面代码就是如果这个图片url没有请求过就会去请求,通过网络的形式从服务器端拉去图片信息,并对成功失败进行处理。

为了实现加载网络图片二级缓存和从从二级缓存中读取,必须重现原来的ImageLoader类,对缓存读取,加载进行重写:

AsyncImageLoader.java

1,可以设置线程池的大小,这里设置为2条线程;

2,getDefaultImageLoader里面调用上面的图片缓存的代码L2LRUImageCache;

3,重点的读取和缓存还是在get方法里面。

然后看线程池里面读取缓存的逻辑:

mCache.getBitmap(cacheKey)是从一级缓存中区读取bitmap,如果一级缓存里面没有,就去下载,调用下面逻辑,拉取下来后,对图片进行裁剪,并将图片放入缓存里面去,而mCache.putBitmap(cacheKey,bmpCompressed);就是调用L2LRUImageCache 的putbitmap放来将缓存内容放入文件和内存中去。

代码摘自:https://github.com/pocketdigi/PLib/tree/androidstudio/src/main/java/com/pocketdigi/plib/volley,可以参考优化volley对图片的二级缓存