main界面视图:
1.JsonRequest 没有有效的json地址,找了google的,400,请替换有效json地址就OK
2.使用的NetWorkImageView
3.使用的ImageRequest
主要说明下ImageRequest,ImageRequest中已经自带了缓存,只需要在代码的地方设置setShouldCache(true);就OK了
通过Volley中的代码,
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), “volley”);
可以知道图片缓存在data/data/package/cache/volley下,缓存key直接使用的是URL,
通过代码
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
可以知道使用的是DiskBasedCache这个类
可以打开这个类,能发现使用一个Map存储的信息
/** Map of the Key, CacheHeader pairs */
private final Map mEntries =
new LinkedHashMap(16, .75f, true);
CacheHeader为DiskBasedCache中的内部类,其实就是一个bean,其中保存了key,length,etag,serverDate等等一系列做缓存是否更新校验的字段
RequestQueue 缓存处理是通过CacheDispatcher做缓存事件分发,同过entry.refreshNeeded()来确定是取缓存还是请求网络。
缓存名字问题:
private String getFilenameForKey(String key) {
int firstHalfLength = key.length() / 2;
String localFilename = String.valueOf(key.substring(0, firstHalfLength).hashCode());
localFilename += String.valueOf(key.substring(firstHalfLength).hashCode());
return localFilename;
}
key代表的是我们下载的url,缓存名字是前半部分名字的hascode拼接后半部分的hascode
关于写入的bean中的数据都是存储在缓存文件中的,
File file = getFileForKey(key);
try {
FileOutputStream fos = new FileOutputStream(file);
CacheHeader e = new CacheHeader(key, entry);
e.writeHeader(fos);
fos.write(entry.data);
fos.close();
putEntry(key, e);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeByte(CACHE_VERSION);
oos.writeUTF(key);
oos.writeUTF(etag == null ? "" : etag);
oos.writeLong(serverDate);
oos.writeLong(ttl);
oos.writeLong(softTtl);
writeStringStringMap(responseHeaders, oos);
oos.flush();
关于缓存到sdcard中可以这样写(这个是我在其他代码测试的 可能跟这文章中代码关系不大)
//下面注释掉的代码是缓存到sdcard中的
// File sdDir = Environment.getExternalStorageDirectory();//获取跟目录
// File file = new File(sdDir,"chen");
// DiskBasedCache cache = new DiskBasedCache(file, 20*1024*1024);
// Network network = new BasicNetwork(new HurlStack());
// queue = new RequestQueue(cache, network);
// queue.add(request);
// queue.start();
项目源码地址:http://download.csdn.net/detail/cj6585256/6407947
有人说下载缺少文件,把Volley源文件地址给上:http://download.csdn.net/detail/cj6585256/6407971
无网络时取的缓存图