Volley 核心源码解析(四)
Volley的缓存
1.磁盘缓存
在Volley类调用newRequestQueue方法的时候,创建了一个file
FilecacheDir=newFile(context.getCacheDir(),DEFAULT_CACHE_DIR);
明显这是做了磁盘缓存
RequestQueuequeue;
if(maxDiskCacheBytes<=-1)
{
//Nomaximumsizespecified
queue=newRequestQueue(newDiskBasedCache(cacheDir),network);
}
else
{
//Diskcachesizespecified
queue=newRequestQueue(newDiskBasedCache(cacheDir,maxDiskCacheBytes),network);
}
queue.start();
这里的意思是:没有设置缓存大小的时候,使用默认的缓存大小,反之使用自定义的大小
看看DiskBasedCache类中的静态变量:
/**Defaultmaximumdiskusageinbytes.*/
privatestaticfinalintDEFAULT_DISK_USAGE_BYTES=5*1024*1024;
构造方法;
publicDiskBasedCache(FilerootDirectory){
this(rootDirectory,DEFAULT_DISK_USAGE_BYTES);
}
这就对磁盘缓存做了一个5M大小的初始化。
具体的DiskBasedCache怎么缓存的这里就不深究了,有兴趣的可以自己去了解,无非就是把内容存到SD卡中。
2.内存缓存MemoryChache
在Volley中我知道的使用内存缓存的地方是在图片加载的时候,Volley中定义一个叫做
ImageCache的接口,
publicinterfaceImageCache{
publicBitmapgetBitmap(Stringurl);
publicvoidputBitmap(Stringurl,Bitmapbitmap);
}
这个接口中定义了两个方法,取和存。
在我们自己实现ImageCache的时候可以用到LruCache,也可以用DiskChche
但是加载图片优先用LruCache更快其次才是DiskChche;
这里给出一个简单的实现:
publicclassBitmapLruCacheimplementsImageCache{
privateLruCache<String,Bitmap>cache;
publicBitmapLruCache(){
cache=newLruCache<String,Bitmap>(8*1024*1024){
@Override
protectedintsizeOf(Stringkey,Bitmapbitmap){
returnbitmap.getRowBytes()*bitmap.getHeight();
}
};
}
@Override
publicBitmapgetBitmap(Stringurl){
returncache.get(url);
}
@Override
publicvoidputBitmap(Stringurl,Bitmapbitmap){
cache.put(url,bitmap);
}
}
现在有很多优秀的图片加载库如Facebook的Fresco,ImageLoader等.
当然Volley的也很好用。
3.网络请求的缓存
在前面章节中已经结束到了,这里就不再细谈。